vickyの做题总结
记录一些结论和技巧,省省脑子QwQ
复习的时候可以配合学会清单食用噢QwQ
正难则反
做题的时候不要怀疑自己!!!尽管冲暴力!!!QwQ
确定博弈中的必胜态
- 对于非终局状态A,可以考虑先手玩家走一步之后的所有可能状态.(称为A的“次态”)
- 若A的次态全都是胜态,则A本身就是败态;否则,A为胜态,且必胜策略就是在次态中选择一个败态留给对方。
例题:ARC137C
网格图中有一线段,两端点均在整点上,两端点横纵坐标差值分别为 a , b ,求线段上的整点数。
- 包括两端点,共
\text{gcd(a,b)+1} 个整点在该线段上。
例题:方格计数(组合计数)
看到题目条件记得第一时间将其转化为数学语言
例题:(同下)区间平均值
当题目推导式子得到含两个不同下标的不等式时
- 考虑求解逆序对。
例题:区间平均值
当重生要打FJOI时考前记得去CF看traveller的代码。
例题:2022 FJOI省选
复习:THUPC2022想象
看到题目式子有固定系数时可考虑杨辉三角(组合数)
-
不一定是对于多项式项数相差1的式子间的系数具有该关系。
-
有时其实是对于项数为奇数或偶数的多项式之间,各系数之间才具有该关系。
例题:交替
DP实质:不能漏情况&&状态转移间不能有情况重叠的分类讨论
例题:变换
前缀和可以用滚动数组(在线)
例题:P2671 [NOIP2015 普及组] 求和
遇到有固定求解式子的题目,首先考虑将其式子拆分成多个部分,分开来求解。对于每个部分我们可以考虑通过前缀和等手段进行优化。
这是一个很重要的计数技巧!!!!
例题:
-
(同上一个技巧)P2671 [NOIP2015 普及组] 求和
-
【组合计数】Three Chairs
\text{差分数组维护} 区间等差修改 \text{时使用二次差分}
说得有点抽象.....
就是当我们要对区间
- 若区间加的值相同:差分基础,略。
- 若区间加的值为一个等差数列时:
也就是对于区间
-
add_i-add_{i-1}=add_{i+1}-add_i
此时我们称我们操作时要加的值构成一个等差数列时。
此时我们考虑对原数组的差分数组再进行一次差分。
易发现等差数列中每一项与前一项的关系是保持绝对不变的。
这正是差分的关键所在。
详细讲解见这篇日报
总之,见到区间加值且加值相等操作时用一次差分即可;见到区间加值且加值间等差操作时用二次差分。
具体操作为:
1.我们在二次差分数组中的
2.然后我们分别在
需要特别注意的是,我们二次查分数组中加上和减去的是数列公差-数列首项的值,不是数列的公差!!!!
因为我们在二次差分数组最前面加上的数列首项对它后面的项也是有影响的!所以如果我们直接加数列公差的话那么该操作的效果就是在原数组上加一个公差为首项+公差的等差数列!!!
具体为什么自己手玩一遍就知道了。
例题:P4231 三步必杀
当遇到题目要求区间操作为对其加一段有规律数列时
-
考虑对该有规律数列进行差分
-
若差分无果,可选择进行一定转化后再看看能不能差分。
例题:
- (同上)P4231 三步必杀
- P6308 「Wdsr-1」笨蛋结构
当发现自己的复杂差分跑不过样例时,第一时间查看是否有需要修改的位置没有修改到位!(用枚举+推式子看一下修改区间两端周围的位置是否有遗漏的需要修改的位置)
- 复杂差分大多需要推导式子,那么此时我们千推万推永远不要忘记差分的基本式:
b_i=a_i-a_{i-1}
例题:
- (同上)P4231 三步必杀
看到二项式的时候敏感一点,看看拆成二项式定理能不能得到什么信息。
例题:- P6308 「Wdsr-1」笨蛋结构
根号分治
更像是一种乱搞思想呢。
当一道题目具有以下特点:
- 时空各有优势但单一方法不能完全AC有多种做法
- 每次输入有多组数据
- 在一定数据范围下不同做法凑到一起可过
那么就可以考虑使用根号分治了。
感觉就是不同做法的大乱炖&&有套路的瞎搞。
例题:P3396 哈希冲突
看到类似“K个互不相等的B的整次幂之和”之类的话要第一时间联想到转化B进制
- B进制转十进制实际上就是若干不等的B的整次幂求和。
例题:【CSND】数位DP入门——例题1
对于一个等差数列,我们仅需知道项数/公差/首项/末项中的两/三(首项末项+随便一个)个信息即可求出该数列。
例题:[SCOI2009] windy 数
关于最长上升子序列长度的 O(n log n) 解法
- 只可用于求解序列长度!!!不可以用来求解具体序列。
-
对于求解序列
a 的最长上升子序列长度,我们定义一个数组A ,A_i 的意义为长度为i 的最长上升子序列的最后一位最小可以为多少。 -
我们从
1 ~n 枚举a 的每一位,然后在A 数组中找到第一个大于等于a_i 的数(下文称为A_j ),然后用a_i 替换掉A_j ,此处用lower_bound 即可实现。 -
那么最终
A 的长度就是a 的最长上升子序列的长度。
- 时间复杂度易证为
\text{O(n log n)} 。
例题:
- treap
- [BZOJ4919]大根堆
当题目对于一个序列只关心序列中的元素的相对大小关系时(也就是可以忽视数值时)
- 若原序列中的数字很大,考虑离散化。
例题:普通平衡树【权值线段树做法】
- 若题目中可直接忽视数值而只注意大小关系,针对每一个数原序列中存在的
n 中相对关系,我们可以将序列转化为n 个如下序列:
- 在第
i 个转化后的序列中,对于数字a_i 我们将其映射至关系0 (也就是相等),则该序列的第i 位元素为0 ,其它位置的元素则为原序列中该位置元素与元素a_i 的相对关系的对应映射。
例题:排列(DP)
比如在例题中很显然只存在两种关系:大于/小于。
且我们容易观察得到序列的操作实际上之关系元素与元素间的大小关系而并不关系元素具体的值。
故我们考虑对于原序列
位运算trick
当见到题目说两个序列有对应元素互斥时第一时间想到状压DP/找互斥性质
可将对应元素替换为0/1,然后运用位运算进行判断两序列是否互斥。
例题: P2150 [NOI2015]寿司晚宴
(博弈论)当有多个石子堆,且博弈者每次取石子的数量一定时
你取了a个,对方紧跟着你在同一堆取了b个,一轮减少(a+b)个 ,其实无论经过多少轮结果都是一样的。
该输的照样输,该赢的照样赢
那么就把每个堆的个数
如果有多堆的话,一人突然对另外一堆来操作,这时,另一人会紧跟前一人去同样的堆操作,且在前一人重新对原来的堆操作之前,也不对前一堆操作。
这样,其实第一人只是将操作推后了而已,他还是要操作的。
那么,为啥另一人会跟着呢?
因为前一人换堆肯定是因为他不换就会输、后一人就会赢,所以后一人这样就可以将前一人锁定在必输的情形,这是出于最佳策略。
所以当我们遇到这类情形时,我们可以直接将每个堆的个数
我们假设两位博弈者
看到顺序相关类的题目时记得试试从相对顺序这一角度进行思考。
- 例题:[0329模拟赛 【IDA*】序列]()
SG 找不出规律怎么办?
- 打表解决一切!万岁!
遇到一些特殊操作如翻转的时候
看一下这个操作是否进行多次相同操作之后等于没操作,如果是的话,考虑数据范围是否支持直接暴力枚举每种情况。
实在不行加个剪枝&相信自己一定能过的。
例题:
- Binary Table(类FWT模板题)
遇到下标相同的两项数字的乘积求和时
也就是求
我们可以考虑将a或b序列进行翻转,然后求
例题:
- P3723 [AH2017/HNOI2017]礼物
看到数据范围带个 \sum \leq \text{能过} 的题目
第一时间考虑是否是虚树,即题目的是否动规可做、动规的关键点是否可组织为树状结构。
- 例题:大部分虚树题。
组合计数问题看到求非严格单调性序列个数,果断在可选择个数后面加上重复数字个数。
例题:
- bzoj4403序列统计
遇到类似蜂窝网络之类的位置可转为二维坐标,但是其相对的相邻关系并不只是一对四的题目时。
直接转多维,用切比雪夫距离、曼哈顿距离、欧氏距离之类的奇怪求距离方式进行二维转多维之后的距离求值,得到可判断的相邻关系。
例题:
- ABC280G 蜂窝网络