好题总结&trick杂谈
NOIP2024复习
大部分题应该都是蓝
12.18:现在主要是好题&典题&trick速记 考前集中复习可能会再加题型总结和例题
1.3警钟:注意一下在这里面只写大体思路少写具体做法喵! 一些DP方程或者数学式子什么的如果思路能描述清楚就不要写! 不要给二刷的自己透具体式子! 二刷要重新推一遍的!
哦顺带一提 因为是非公开内容所以Latex乱七八糟完全不合乎周礼 致歉呜呜 希望二刷的自己不要介意QwQ
贪心
P3698 [CQOI2017] 小Q的棋盘
比较简单的树上小贪心 需要注意的结论是这种走n步能遍历到多少不同点 我们先取最长链/直径 这部分是一步一个贡献 链外结点是两步一个贡献
P2870 [USACO07DEC] Best Cow Line G
经典的贪 需要找从两侧向内第一个不同的点 二分+哈希或者SA
P2882 [USACO07MAR] Face The Right Way G
典题+1 遇到过不止一次了 结论是直接从前往后扫 遇到方向不对的牛就直接翻过来 差分维护
P4998 信号站
典题+1 在一个数轴上有一堆关键点 选择一个点使其到所有点距离和最小 选择中位数即可
P3243 [HNOI2015] 菜肴制作
贪心难度显然>图论难度 需要注意的点是让字典序小的点尽可能靠前不代表使序列字典序最小 而是使反序列字典序最大
Smithing Skill
唉其实我觉得下位蓝了 赛时感觉还是想了一会儿的吧
根据贪心 处理出来一个a-b递增且a递减的序列 在这个序列中 显然你能选较靠前的元素就不会去选靠后的对吧
注意到c很大不好计算 但是在此情况下只会拿1号元素 直到拿不了为止 而在这之后c在1e6以内 可以预处理出来最优的转移策略
DP
P1220 关路灯
费用提前计算 区间DP 状态设的是关掉[l,r]内的灯后已经消耗的电费
P1272 重建道路
转移顺序很有意思的树上背包 复习树上背包的时候当例题用
P2893 [USACO08FEB] Making the Grade G
slope trick 例题
该技巧用于维护 连续的 是分段一次函数 是凸函数 每一段斜率较小且为整数 的函数
P1707 刷题比赛
我的矩乘优化DP板子!! 必须要有一席之地 顺便%一下牛蛙 关于矩阵的技巧基本都是他教的
Card Game
感觉是蛮考验状态设计能力和转化能力的DP 有点像背包
不难发现1花色的卡牌十分特殊 似乎不好处理 而其他花色相对平凡 f[i][j]表示考虑了i个花色的卡牌 还剩j张1卡牌 转移枚举在该花色上B比A多出来几张即A需要多少1来补 剩下的牌必须平分给两人
$f_{i,j}=f{i-1,j+k} * g{m,(m-k)/2} $
其中g[i][j]表示前i张牌中选出来j张的方案数 注意此处强制钦定j*2<=i 不然就不合法了 所以不能直接套组合数
[AGC013D] Piling Up
思路超级妙的DP!天才转化!我天呐人类智慧啊!能想到第一步转化剩下就没什么难的了
我们考虑把转移扔进坐标系里 x表示操作次数 y表示白球数量 f[i][j]表示第i次操作白球数量为j
最终答案为折线形态数量(位似图形只算一种) 如何不重不漏? 考虑只统计接触过下边缘的折线 所以在DP状态里再加一维0/1 稍微画一下具体的折线图就可以得到转移
Distance to Different
很牛的转化!
观察题目 发现b的构成只与a中相同数字的连续段有关 所以考虑f[i][j]表示到第i个数字划了j段 注意长度为2的连续段在序列中间形成的b为[1,1] 其作用等价为2个长为1的连续段 所以强制钦定长为2的连续段只在两端出现 划分至少k段 多于k段的方案数可以不做区分直接都算在k上就行
[AGC015E] Mr.Aoki Incubator
觉得转化都好厉害啊
首先不难观察到 当一个点i被染色 所有位置在他之前且速度大于他和位置在他之后且速度小于他的点都会被他直接染色 考虑这些点还会间接染其他点 观察一下 两个极端是速度比他慢的里位置最大的 和 速度比他小的里位置最小的 如果我们按照速度或者位置排序 都不难发现是一段连续区间 且左右端点均单调 那么转化选为一些区间覆盖[1,n]整个大区间 且区间具有很好的左右端点都单调的性质 简单的前缀和+决策单调性优化DP
P1070 [NOIP 2009 普及组] 道路游戏
很不错的DP优化题,最开始一直没想起来怎么处理这个三方,看到单调队列优化的提示会的,主要问题在于写DP方程的时候那个算贡献的形式写的比较丑,于是就没注意到是一个斜着的滑动窗口,DP优化还是要多手玩画图感觉一下转移的过程
P1758 [NOI2009] 管道取珠
数据造的\n\r就比较难评了。转化很牛。
考虑我们直接计数每种序列的方案数是不容易的,因为显然不能去枚举序列的形态,那这个平方应该怎么处理就比较有意思了,这时候不妨注意一下为什么是平方而不是什么奇奇怪怪的系数,于是就可以比较自然的发现我们有两个人,分别独立进行游戏得到相同最终序列的操作方案数恰好就是这个平方项,于是剩下的就是简单DP了
P4728 [HNOI2009] 双递增序列
状态设计很有启发性,可能因为见过类似的东西倒是想出来了,f[i][j]=v表示到第i个数,包含a[i]的集合大小为j,另一个集合结尾元素的最小值。考虑到一定有一个集合包含a[i]的所以指记录另一个集合的结尾信息即可,然后这样的话因为有大小为n/2的限制是三维状态,但是注意到f指记录是否可行是很浪费的,这时候就不难想到把一个限制扔进去,有点像LIS那个尽量让结尾小的二分思路
数据结构
P1712 [NOI2016] 区间
蛮有意思的数据结构题呀 数据结构+尺取 选m个区间 要求交不为空切区间长度极差尽可能小 注意到答案的贡献只和区间长度有关 我们考虑按长度排序然后双指针 直到剩下的区间在交上不足m个 拿线段树维护这个区间覆盖即可
Unique Array
不算难 但赛时没切 其实这题思维重点不在数据结构上来着 但是我觉得也不是纯正贪心 所以还是扔到数据结构里面吧
考虑我们替换一个元素 那么所有跨越它的区间就一定都合法了 问题变成左右两个独立区间是否合法 进一步的相当于这些被替换的元素把序列分成若干段 每一段内部都合法 那么我们从头开始扫一遍 每当一个前缀不合法就立刻把他替换掉 然后开始新的一段 线段树维护每个元素是否只出现过一次
SP1557 GSS2 - Can you answer these queries II
我为啥连这种DS都没做出来啊啊啊啊啊!
维护前缀的后缀或后缀的前缀 就相当于维护了所有子段
于是考虑对r做一个扫描线 对所有l维护当前后缀及历史最值
图论
P1453 城市环路
经典的基环树DP题 环+森林和树+边的方法都可以做 复习例题
[AGC013B] Hamiltonish Path
为啥我不会这种题啊啊啊啊啊啊绷不住了啊 赛时做法假了哈哈
假设我们现在有一个路径{u,x1,x2,......,v} 如果端点不满足限制就直接向外扩展 注意到在扩展到n个点时就一定合法 双端队列维护即可
[AGC017E] Jigsaw
考考你的图论建模能力! 其实见过的俄罗斯方块题不少 一般要么轮廓线相关要么图论相关吧 不过我很少切出来就是了
首先考虑给可以拼在一起的点之间连边 但是显然炸完了 考虑能不能自定义一个权值使得可以拼在一起的点有相同的表示 我们钦定:
如果c>0 u=c+h 否则 u=a
如果d>0 v=d 否则v=b+h
一个拼图相当于一条连边 现在我们想找到若干从<h的点到>h的点的路径 使其覆盖所有边 那么需要满足的条件与欧拉回路类似 但由于我们可以有很多条路径 条件更为宽松 <h的点入度不大于出度 反之出度不大于入度 且每个连通块至少有一个点出度入度不等
数学
P2312 [NOIP2014 提高组] 解方程
秦九韶板子 感觉这个知识点很容易复习不到 所以在这挂一下
不断提取\(x\) 可以做到对于一个n次多项式用n次乘法n次加法求解
树上问题
期中#1T3
场切了,第一次见这个trick应该是在ZR,但懒得去找原题了
动态维护树的直径,每次新加入一个点,新直径两端点与原直径两端点至少有一个点相同
杂项
P1429 平面最近点对(加强版)
比较经典的小结论 分治后跨左右区间需要枚举的点只有6个
P1419 寻找段落
序列最大子段均值 限定长度
考虑二分一个均值 做差 转化题意为限制长度的最大子段和 单调队列维护即可
[AGC013C] Ants on a Circle
很好也很经典的trick题! 先考虑如果是序列上怎么办 发现由于相撞后反向运动 蚂蚁之间的相对位置是不变的 也就是说我们可以不管具体是哪个蚂蚁在哪个位置 只需要知道这些位置 自然可以还原每个蚂蚁的具体位置 一个想法是我们把相撞后掉头看成穿过彼此并互换编号 由于上述性质 实际上不需要维护编号 那么就是朴素直线运动了 那么继续扩展到序列上 位置从同构变成了循环同构 我们考虑如何维护这个循环 发现一只蚂蚁顺时针穿过原点一次相当于从队尾走到了对头 即所有位置在模n意义下+1 逆时针同理-1 那么只需要维护这个修正项即可
Make a Palindrome
赛时手玩感觉出来了操作12好像没啥区别 但是不会往下推啊啊啊!
手玩一下发现 操作12其实效果相同 都相当于让序列减少一个未匹配元素 所以可以只考虑1操作 不难得到答案上界len-1 考虑在什么情况下才会减少 发现如果有一段前后缀sum相等 相当于把这段前后缀缩起来以后 自动出现了匹配的元素 所以答案-1 那么我们只需要统计所有相等的子段数量即可 没一对有一个-1的贡献
[AGC016E] Poor Turkeys
核心思路 留下来是为了以后挡刀用的
f[i][j]=0/1表示为了让i存活是否需要留下用来挡刀 观察充要条件 对于一个而言 如果一步的ab都是需要被保留的那i肯定就活不了了 那么在剩下的自身可以存货的鸡中怎么判断两者能否共存? 答案是两者需要的挡刀集合无交 因为一只鸡给i挡刀了就没法再给j挡刀 依照上述思路枚举递推即可
[AGC017C] Snuke and Spells
精妙结论!人类智慧!
观察题意 在还剩\(k\)个球的时候把所有\(a_i=k\)的球删掉 相当于一个\([k-cnt[a_i]+1,k]\)的线段 而全部删完相当于若干线段不重不漏覆盖\([0,n]\)这段区间
那么修改操作从x改为y 相当于x处线段延正方向缩一个 y处线段逆正方向长一格 那么实际上的操作次数就是有多少格没有被覆盖上 最开始直接差分扫一遍 后续的修改都是单点的容易维护的
[AGC023D] Go Home
好厉害的题 想的时候一直觉得有点DP 反正一直没在标算这个思路上 但是我还没总结出来怎么想到的这么厉害的思路啊 留坑 现在感觉就是那种考察是否和出题人心意相通的
手玩样例不难发现 整体形如一个在不断扩展的区间里震荡的模型 每个人都往离自己家更近的方向走不一定最优 如果是先往自己家方向走一段 少了一部分人然后开始寡不敌众往另一端走最后再回来 就不如最开始直接往另一端走 然后一路直接回自己家 再继续考虑 寻求一个更加形式化且统一的判定标准 即
对于一段区间 \([l,r]\) 如果 \(a_l > a_r\) 那么r处的人会帮助l处的人先回家 自己再回家 即r处人的贡献为l处贡献+\(p_r-p_l\) 证明如下:
- 如果车在[p_{r-1},p_r]上,所有人都会选择往l方向走
- 如果不是,考虑在到达r之前要么在r-1要么在l,如果在r-l处,这部分人下车后又变回1
CF2085F2 Serval and Colorful Array (Hard Version)
线性做法,两次差分,挺妙的思路。
考虑枚举集合点(子区间中点)最优策略一定是两边各一半的,如果对于每个元素直接取左右两边离集合点更近的一个一定可以取到这个下界,所以该限制可以转化。
然后维护每个元素距集合点最近距离就好,具体而言可以考虑维护一个变化量,即随着集合点移动左侧元素+1右侧元素-1,在该元素相邻两次出现位置的中点处发生变化,注意分奇偶讨论一下,维护变化量的变化量即可。
P12148 【MX-X11-T2】「蓬莱人形 Round 1」所以我放弃了音乐
传奇黄题,赛时假了5个做法(? 然后被硬控没场切
看上去最正确的假做法是按照 \(x+(M-y)\) 排序,其中 \(M\) 是 \(\max{y}\) 即从右上往左下贪心的取链,hack是

实际上直接考虑答案上界为n,一个点只要不是链顶都可以令ans-1,排序然后双指针匹配即可
P12150 【MX-X11-T4】「蓬莱人形 Round 1」视奸
传奇绿题,主要考察第一眼对解法的感觉及手玩能力,想出来什么神秘DP之类的东西基本就完了吧,然后一大难点是只有一个样例还特别水,所有细节需要自己捏
手玩发现,对B分段,两个1之间间隔超过1个0就无法联系在一起了,因为没有手段可以消掉B中间这段0上A中的1
其次对于一个01段而言,如果纯1,那么A也必须全填1,不然无法消除中间的0
否则,注意到在B两边都有1当墙的情况下,A在 \([l+1,r-1]\)上只要有至少一个1就可以构造出任意情况,因为你可以推着0到处跑,然后A在l和r处选不选都可以
唯一需要特判的是101的情况,此时可以直接选择101,与上文中间必须有1矛盾
[ABC204E] Rush Hour 2
记一下思路点 取代价函数最值点
[ARC123C] 1, 2, 3 - Decomposition
比较核心的结论是 $ ans \le 5$ 因为这时候取值范围 \([5,15]\) 可以覆盖值域
那么状态就很少了,做法很多,写了一个枚举答案然后check是否合法,按位搜枚举是否有进位即可
细节处理训练
以后大考复习可以来板刷一下这里的题 都是曾经被细节问题卡住调了很久的
-
P9485 「LAOI-1」积水 小思维模拟
-
P11361 [NOIP2024] 编辑字符串 贪心+模拟
-
P7560 [JOISC 2021 Day1] フードコート 大DS 整体二分+线段树
-
P1363 幻象迷宫 bfs
-
Job Interview 二分 贪心

浙公网安备 33010602011771号