NOIP冲刺之超市T2计划(upd on 1112)
超市T2计划总结
- 超市T2计划总结
- 声明:
- 刷题:
- 三国游戏:T1
- 尼克的任务:T2
- 卖萝卜:T1
- 剔除多余括号:T2
- 引水入城:T3
- Medium Design :T3
- 加工生产调度:T2
- 方圆幂积:T3
- 打地鼠:T1
- 取相片:T3
- Rmq Problem / mex:T2
- Peaks:T3
- Doremy's Connecting Plan:T3
- 小A的数字:模拟赛T1,难度在T4。
- 小B的平方数:模拟赛T2,难度在T3左右。
- 小C的游戏:模拟赛T3,难度在T3左右
- 爬山:T1
- 补丁数组:T1
- 种树的艺术:T2
- 聪明的学生
- 春风化雨:模拟赛T2,难度在T3-
- Doremy's Drying Plan (Easy Version):T3
- 跳棋:游园赛模拟赛 T3,思路难度在T2,代码难度在 T4+
- Suspicious logarithms
- A Growing Tree:T2
- 安装饮水机:T2
- 贪心?DP?:T3
- Termites:T114514
- 倒时差:T2
- 旅游巴士:T3
- 保护村花:T1
- 廊桥分配
- CSP 逻辑表达式:T3
- 回文:T3
- 数列:T4
- 策略:
- 总结:
声明:
本贴用于总结对于csps-noip T2左右难度的题目。
会选择一些NOIP的题目,或者是codeforces过的人数在1500~3000的题目。
然后分为了 T1-T6 6个级别
也是为了超市NOIP T2
这种题目简单的话就只考察思维和简单算法,中等的话可能会让你自己设计某种和常见算法思想的算法(如dp),难的话可能涉及到容斥计数啊什么的。
刷题:
三国游戏:T1
发现性质题目,简单到爆
尼克的任务:T2
首先你要想得到dp。
我个人说实话没想到倒着dp,正着dp倒是想到了,但是用了个vector记录某个值前面可以由什么转移过来这里可以简化。
具体的话等过了这道题可以luogu上搜索LingHusama看我的思路(写在代码里的),讨论区我和青白大佬也讨论了我的70pts问题
都找到前面哪些情况可以转移到此,那么直接从前往后递推给贡献就好了。
还有要注意初始化数组问题
卖萝卜:T1
最开始以为是dp,但是存的状态可能会很多,然后想到了商店情况一定是选择购买。所以就发现可以贪心。
但还是没有一遍过,原因在于找front的时候没有看是否为空的,然后RE。
剔除多余括号:T2
简单是简单,但是有坑,代码也比较难写
坑:a-(b-c)不能去掉
引水入城:T3
为什么放在T3难度呢?因为你要发现区间覆盖的性质。
感觉还是有点难的,关键在于看你能不能发现如果成功的话,就变成了贪心区间覆盖问题。
如果你能覆盖的话,一定是覆盖了连续的一段区间。
其次还要记忆化搜索,这个确实没想到。
Medium Design :T3
这个就是纯粹的发现性质题了。
为什么放在T3难度呢?因为我写假了,最开始思路错的
性质就是:你最小值一定会出现在1或者m处。
然后呢,只要我不覆盖1/m就好了。
然后两种分类讨论下,做个离散化、差分找最大值就好了。
加工生产调度:T2
很明显的一种贪心题目,甚至不用dp,排个序乱杀就彳亍。
为什么还要放在T2难度呢?毕竟贪心的这个性质还是要你自己去找(去推柿子的)
方圆幂积:T3
我觉得这道题对我而言值得放T3难度。
首先我就被诈骗了,以为是数论。
过了很久才发现,这个输入long long都不行,只能是字符串。
那就是字符串的题目了。然后发现随便乱搞hash一下就能过。
打地鼠:T1
纯粹暴力,差分前缀随便用一下就行了。太简单了。
取相片:T3
为什么放T3难度呢?因为感觉也有点像诈骗。
博弈sg函数是我第一眼想到的,但是觉得没必要,就觉得贪心。
然后分析了半天什么时候应该取,什么时候不应该取,然后wa 10 pts。
其实没必要,完全可以看成能选就选,最后减去最差情况。
那么什么时候能选就选呢?完全可以看成两个人中有选择就选择这样。(感觉说的不明不白?)
反正最后就是整体贪心做一下就好了。
Rmq Problem / mex:T2
很常见的一种题型,但是这道题相对较板子
用lsat(l,r)表示第i个数字在1~r处最后出现的位置
将r看做时间,每一次最多修改一次
对于一段区间l~r
我的目的是找到一个last<l的最小的数字
关键是值域线段树维护什么?
每一次我都想往树的左侧走
那就要确定左侧是否存在一个<=l,存在性问题就是最值问题(数学思想)
只要左侧最小值<=l就存在。否则我就只能往右走。
很容易就一遍过了。
Peaks:T3
这个是比较明显的可持久化值域线段树板子
那么为什么放在T3呢?第一是代码细节很多,第二是kurskal重构树我是真的忘记了
Doremy's Connecting Plan:T3
主要是优先队列你要优先什么需要好好想一下,所以放了T3
小A的数字:模拟赛T1,难度在T4。
关键是这个n+1~2n看看你有没有发现什么,对于所有数字(<=n)且二进制下有k个1的数字,其实就只是左移了一下罢了。然后最后一位给你空0出来。
那么这样就把所有偶数满足条件的给找到了,于是现在要找奇数的满足条件的个数。
由于最后一位你要给他一个1,所以你要在1n找k-1的个数。但是要好好思考,这里应该是1n-1哦(绝对不是我碰运气碰到的)。
分析好上述东西后,我们利用差分就发现求的就是1~n-1内k-1的数字个数。这个就可以用数位dp+二分答案验证就好了。
找到上界和下界就好了(绝对不是因为我碰运气刚好碰到他们相减+1就是第二个答案……)
(其实这道题我碰运气碰了40min+才刚好碰到了)
小B的平方数:模拟赛T2,难度在T3左右。
这道题难度和T1差不多,对我而言方法也类似(猜测结论+打表验证)。
有一种很强烈的预感告诉我前面的很多都可以消除,最后只剩下两个区间绝对不能被删除。(打表达出来的)
可惜,没开int128导致最后成绩和暴力一样。(主要我不会写,快读快写到现在都不会背)
到最后还是不知道区间左右开闭问题出在了哪里,只能说很遗憾吧。
小C的游戏:模拟赛T3,难度在T3左右
难度在T3完全只是因为看你能不能想到最短路了。剩下的就只是各种优化罢了。
说实话这一道题我一拿到就往dp上面扯,忘记了老子出关那道题。都是转化成最短路来搞定。
导致暴力都GG了。
爬山:T1
没啥好说的,加工生产调度模型。
补丁数组:T1
贪心。
如果没有这些数字的话,选择肯定是1,2,4,8的二进制。
那么现在已经有一些了,有个新的我们就以这个数为基础继续搞二进制就好了。
种树的艺术:T2
我觉得这道题难度在2~3左右。
主要原因是看你插入dp熟不熟悉(反正这是我第一次做)
插入dp主要是看你能不能找到转移方程。
突破点在最小值。
放在最左侧时,不影响右侧。
放在最右侧时,不影响左侧
放在中间时,都不影响,有n-2个放置方法。
聪明的学生
好好好,我是sb所以我猜不出来再见……
像这种题首先要画图分析,然后模拟样例。
对于每个人而言,其实都有两种答案,不然自己是abs(a-b),不然就是(a+b)这样。
思考一下为什么能猜出来,以及和N有什么关系(不然人家也不会给你)
假设你是其中一个玩家,对面的一个是A,一个是B,其中A>B
你有两种可能:A-B或者A+B
那凭什么能猜出来? 因为如果我是A-B时不合法。话句话说,如果我是A-B的话 你们早就该猜出来了。
例如1,2,3,对于3而言,如果他为1的话 别人早就猜出来了。
考虑递归,求解子问题就好
春风化雨:模拟赛T2,难度在T3-
首先这个二分图的建立司空见惯了,就不多说了。
然后k=1就是二分图乱匹配。
k=1+我就没想出来(在考场上)。说是网络流24题的板子题目……
因为两个相同权值匹配是最好的,所以分层级讨论,每一层做一个匈牙利。
Doremy's Drying Plan (Easy Version):T3
最多也就只能放在T3的难度了。
首先利用差分,得到每个点被覆盖次数。
考虑你删除线段能做出的贡献,由于k=2只有以下几种情况:(我们假设一条线段的贡献是这条线段包含区域内被覆盖次数为1的点的数量)
- 选择两条不相交的线段,ans为他们的贡献之和。
- 选择两条相交的线段,ans为他们的贡献之和,以及两者交在一起的部分被覆盖次数为2的数量
显然其他情况,要么不被覆盖直接贡献,要么覆盖次数为3无法贡献。
我的做法是类似扫描线一样,开个set存在这个点上的线段是哪些,当size=1和size=2的时候进行判断就好了。
当size=2时我开了一个pair的map来维护两个线段交的贡献。
代码
跳棋:游园赛模拟赛 T3,思路难度在T2,代码难度在 T4+
为什么我只放T3出来,因为这道题本100pts-->0pts了。原因就是一时思路短路了。
先上原因:对于多个博弈游戏,最后结果为SG异或,不能只用0/1表示,因为SG不止0和1,SG还表示着赢得多少。
这道题我就只表示了0/1而不是0/1/2从而导致最后一错到底。只能说写了这么久,优化也想了,但最后G了,很可惜。
为什么说代码难度在T4+,因为存在一排内环的情况,你不知道要是连成环后SG怎么计算。
Suspicious logarithms
本来打算做的,结果发现和数论关系有点大,所以没继续了。
A Growing Tree:T2
发现每个节点的权值只和加入它后有关,所以倒着方向考虑就好了。
安装饮水机:T2
记得书上关于优先队列有一道加油站,和这个应该差不多把
P个有关系,其实是线段,要求线段至少覆盖一个点 ,这种应该是贪心。
直接按照右端点排序,每次尽力放在右端点上即可。
贪心?DP?:T3
我发现我对这种时间给的多的反而要想很久。
注意是n种货币
因为a_n=1所以肯定凑得出来
看到 \(O(N^3)\),很懵
本来想二分答案,发现没有单调性
假如我们可以加上或减去数列里的一个数,那么这个贪心就是对的。只有加法的话,不对。理由在样例二中已经给的很清楚了。
那么我们只需要模拟两个过程:一个是贪心(可能会假),另一个是自己枚举的反例,找到了就输出,没找到就输出-1.
然后我们思考什么时候可能会有这种假的情况:
找一个面值A,如果有一个比A大一些,但是另一个面值B的整数倍的钱数,那么就有可能使得先选A,剩下的就变得零碎,如果直接用整数个B凑,就能凑齐的情况。
所以我们三重枚举来模拟这个过程即可。
(不加快读不给过?)
Termites:T114514
老师放错了,原题是取石头游戏,是道黑题,不建议打。
然后我就写了篇博客出来……
这里
倒时差:T2
这个就是个dp,状态应该很容易设计出(毕竟操作次数和时间值域都很小)
考虑前i次操作,当前停留在时间j的最佳睡眠次数 。
直接dp就好了,但是要求从上一次特定的时间转移过来,所以我多维护了个set来辗转存储上一次所有情况的结束时间。
用set是因为时间可能会有重复的,保证了不会进重复的时间,所以时间复杂度在 \(O(n^2\logn)\)的样子
一遍过好耶!ヾ(✿゚▽゚)ノ
好像还有 \(O(n^2)\)做法?
旅游巴士:T3
为什么放在T3?看你能不能发现k的性质了。
反正我个人是没想到\(modk\)的,我直接去想跑环什么的了。(最短路我都没想到)
以下是我做题时的思路
好好好大家都会是吧,就我难受是吧。
感觉挺有难度的
没思路,看数据范围,\(k<=100\)?那k是关键了,100感觉是modk进数组
以下是我看了题解后的总结:
\(dis_{i,j}\) 表示到达点i,此时时间\(modk=j\) 的最少时间。
答案为dis_(n,0)
此时分两种转移;
当当前边可以走的时候,
$ dp_{to,(j+1)%k}\(=\)min_{dp_{u,j%k}+1} $
当当前边不能走的时候,我要换一个时间出发,要重新计算时间,具体转移在代码内部。
以下是题外话:
哦ljh是看的luogu第一篇题解抄过来的啊,那没事了。
保护村花:T1
我的第一想法是倒着操作,但是好像和正着搞差不多?
都可以直接贪心做,让剩下的每秒花费的最少
廊桥分配
这道题我G了(如果在考场上的话)
我的想法也是直接算给i个廊桥的情况下,能最多给到的飞机数。
我也是按照时间顺序添加的。
但是有个问题,假设所有廊桥你都可以放置当前飞机的话,我放在哪里呢?
肯定不是任意一个,因为如果这一次时间特别长,放在停靠飞机最多的廊桥那里,显然不会优秀。
所以应该整体上一起考虑才对。
CSP 逻辑表达式:T3
我觉得可以放在T3,这种题型值得积累。
当你被很多很多加减乘除题优先级的顺序搞混时,可以看看这个。
分治的话,就是本来求l-r,变为找到其中一个不在括号内且优先级最低且在最后方的符号,记位置为pos
然后分治为l-pos和pos-r。
然后呢,每一次找一次时间是 \(O(N^2)\) 的,这时候要想方设法预处理。
回文:T3
我觉得这道题可以放T3难度,原因是我本人没想出来。
会发现分开一次后变成两个双端队列,维护即可。
数列:T4
值得上T4难度,我个人写的暴力搜索得了50pts,没有想到dp。
主要是n,m的范围太小,不用说,dp的话肯定状态很多,我个人没有设计出来。
我个人是在参考了第一篇题解后自习写的转移柿,然后A了这道题,回过头来发现只要状态设计对了就很简单。
当然我个人感觉这种dp也是分组背包的一种dp转移柿子。
大概就是,考虑第i种物品,在其中已经选择了j个物品(不含i),在某种限制k下的答案是什么。
这种就考虑往后转移,若是计算方案数,就肯定有一个C(n-j,t)的东西在里面(t要枚举)
这样的时间复杂度,在没有任何限制要求下大概是mnn的。
当然这也就给了暴力记忆化搜索一种思路。
策略:
- 遇到数论直接部分分,30分钟到了直接跑。
总结:
(随着刷题慢慢更新)
- T2难度的题目需要你突破找到某种关键性质,再设计出算法。(总体上)
- (题型)求解计算具有某种性质的字符串时,如果发现两个满足条件的拼接起来一定还是满足条件的话,可以O(n)找到以i结尾的最短满足条件的字符串开头是谁,然后再O(n) dp。
- (题型)给定一个n序列,m查询,每次查询l~r范围内满足某种性质的数是什么/经过某种计算后可以得到什么?
这种题常常对于每一个r要维护某个数组,表示1~r的某个东西,利用差分解决。(当然有时候也要利用可持久化值域线段树来维护) - (题型)给你一个图,对于一个点想让你求解距离<=x的某个东西。(注意区分树上dp)。
kruskal 重构树一定不能忘了,对边排序(从小到大),然后每一次将不再同一个集合中的两个点新建一个新的点(点权是这条边权),然后链接。
这时候对于一个点,直接倍增跳父亲节点找到最大的不超过x的根节点,其子树内都是可以到达点。 - (题型):给你一些要求和条件,问你能否达成某件事。
这种求能否的问题只有三种解决方法:贪心、dp、特殊性质。
看到log的情况,优先要想到优先队列做贪心。特殊性质的题目常常会放在NOIP第一题,一般都是结论题或者O(1)的分类讨论题。 - (题型):叫你找性质或者做数论推柿子什么的,思路给你大概方向(不必准确),打表尝试给你正确答案。方向确定,打表测定。
- (板子):加工生产调度模型,只需要记住在A时间短的靠前,B时间长的靠前,然后模拟就好了。
- (题型):插入形dp,插入dp的话一般都是突破点在考虑特殊值,一般考虑插入当前最小值或者当前最大值就好了。
- (题型):对于多个博弈游戏,最后结果为SG异或,不能只用0/1表示,因为SG不止0和1,SG还表示着赢得多少。
- (题型):当发现一个东西的权值只和加入它后的操作有关时,倒着考虑。(常见的有并查集,删除边可以考虑为倒着加边)。
- (易错):当用左右指针的时候,随时注意le>ri就break的情况,不然……我这一次绑点100pts->0
- (技巧):当某个元素较小时,可以思考怎么讲答案转化为有关这个元素的东西,并思考他可以和谁组合成多维数组dp(一般就会这么考吧)
目前只遇到了mod k压入数组的情况(k较小) - (题型):很多题很像那种分组背包(或者有部分分有),但是时间复杂度可能不对,可以去看看数列这道题。
- (易错):最好不要用指针去维护vector,可能会RE,最好还是用sz判断是否为空。

浙公网安备 33010602011771号