刷题总结DIV1C
知识点
枚举
cnt枚举2个量
在一个数组中, \(cnt[x]\) 代表 \(x\) 出现的次数 \[ \sum_x cnt[x] \le n \] 于是可以枚举所有 \(x\) 在枚举所有小于 \(cnt[x]\) 的数,总复杂度不超过 \(O(n)\)
CF1637E(2100)
枚举 \(2^k\)
长度是 \(2^k\) 那么直接枚举 \(k\) 即可
CF1626D(2100)
二分
同时检查多个参数:
用二进制表示,0表示不符合,1表示符合,放到一个集合里,再枚举集合
对 $x_i \(找下一个不超过\)L$ 的点,可以用lowerbound查询
倍增dp
整体二分
CF1601C
并查集
对于两者选1的问题,用边建图,然后分析。
数据结构,小的向大的合成可以降低复杂度
神奇构造
分式 \[ \frac{1}{x(x+1)} = \frac{1}{x} - \frac{1}{x+1} \]
arc163c
拆分再组合
构造部分解,然后组合成最终解
循环构造
三角形数
\(1+2+..+k\) 的和
Fermat polygonal number theorem:
任意正整数可以拆分成不超过3个三角形数的和
扩展:
不超过7个三角形数,如果连续按最近的三角形数拆分 (验证正确 <= 1e8)
排序
如果交换任意两个位置,那么最小交换次数是 \(N-\#ring\) 环的数量.
ABC302G
数学
式子推导
平均值处理
\[ \frac{1}{k}\sum_{i=1}^k a_k \ge S \\ \Leftrightarrow \sum_{i=1}^k a_k \ge k\cdot S \\ \Leftrightarrow \sum_{i=1}^k (a_k-S) \ge 0 \]
ABC292Ex
个数限制
在
\[ \left \lfloor \frac{m}{1} \right \rfloor+\left \lfloor \frac{m}{2} \right \rfloor+...+\left \lfloor \frac{m}{m} \right \rfloor \le O(mlog(m)) \]
CF1657D
中,最多有 \[ 2\sqrt{m} \]
个不同的数
证明:
考虑 \(m/k\)
\(k>\sqrt{m}\) ,
\[ \frac{m}{k} < \frac{m}{\sqrt{m}} = \sqrt{m} \]
最多不超过 \(\sqrt{m}\) 个
\(k \le \sqrt{m}\), 设 \(t = \lfloor \frac{m}{k} \rfloor\) , 显然 \(t\ge k\)
\[ \left \lfloor \frac{m}{\lfloor \frac{m}{k} \rfloor} \right \rfloor = k \]
成立
证明:
\[ kt \le m < k(t+1) = kt+k \le kt+t = k(t+1) \\ kt \le m < t(k+1) \\ \left \lfloor \frac{m}{\lfloor \frac{m}{k} \rfloor} \right \rfloor = k \]
一共不超过 \(\sqrt{m}\) 个
CF1603C
取模公式
\[ a \bmod b = a-b\cdot \lfloor \frac {a}{b} \rfloor \]
CF1553F
整除公式
\[ \begin{aligned} \lfloor \frac{a}{b} \rfloor&=0 , a\in [0,b) \\ \lfloor \frac{a}{b} \rfloor&=1 , a\in [b,2b) \\ ... \\ \lfloor \frac{a}{b} \rfloor&=k , a\in [kb,(k+1)\cdot b) \\ \end{aligned} \]
可以考虑贡献
CF1553F
平均分配 \(A_i\) 到 \(k\) 个数上 \[ \sum_{j=1} ^{k} \lfloor \frac{A_i+j-1}{k} \rfloor = A_i \]
因子个数上界
X的因子个数约为(近似值) \[ O(X^{\frac{1}{3}}) \]
组合数学
考虑最大的数,然后隔板法
容斥原理
需要用容斥原理的计数dp
卢卡斯定理
https://brilliant.org/wiki/lucas-theorem/#proof-of-the-theorem
CF1673B(2500)
概率期望
期望神奇化简公式 \[ E[X]=\sum_{i=1}^Mi \cdot Pr[X=i] = \sum_{i=1}^M Pr[X\ge i] \]
ABC295E
消元解期望
期望式子很复杂,但是到一段有解。可以列关于父亲的表达式,然后迭代上来解
1823F
FFT
先写出式子,右边界可以根据 \(i+j <
|S|\) 来确定 \[
\min_{0\le i\le |S|-|T|} \sum_{j=0}^{|T|-1} s_{i+j} \oplus t_j
\] 然后翻转 \(t\) , 令 \(j'=|T|-1-j\) 然后把 \(j=|T|-1-j'\) 代入,然后把 \(j'\) 用原来的符号 \(j\) 代替 \[
\min_{0\le i\le |S|-|T|} \sum_{j=0}^{|T|-1} s_{i+j} \oplus t_{|T|-1-j}
\] 然后写出卷积的式子 \[
c_i = \sum_{j+k=i} s_j \oplus t_k
\] 然后我们知道 \(i+j + |T|-1-j =
i+|T|-1\) 所以 \[
c_{i+|T|-1}= \sum_{j=0}^{|T|-1} s_{i+j} \oplus t_{|T|-1-j}
\] 然后用乘法更换xor操作, 也就是分成2个卷积计算
\[
a \oplus b = a(1-b) + b(1-a)
\] 那么对于 \(c\)
来说,最终的下标是 \[
\min_{|T|-1\le i \le |S|-1} c_i
\]
ABC196F, ABC290G
图论
完全图
欧拉路径构造
https://codeforces.com/gym/103329/problem/D
最短路
01BFS
0的边权放在队列头,1的边权放在队列尾
Dijkstra
势能法处理负权
ABC237E
树
度数和树的等价关系 \[ \sum_{i=1}^N d_i=2(N-1) \]
计数
改变计数维度
考虑贡献:有多少个不同的答案,每个答案有多少贡献
CF1603C
找规律发现很多数字相同。把相同的数字分组,然后对组的和进行dp
ABC232E
把相同位置找出来,然后看有多少个符合的数。而不是枚举每个数看不同的位置
ABC295F
横着数改竖着数 \[ \sum_{X\in S}f(X) = \sum_{i=1}^N X\in S\and f(X_i) \]
ABC290F
利用对称性
\[ \sum_{i=1}^N f(X_i)= N\cdot f(X_1) \]
ABC290F
对所有子数组计数
找pair \((l,k,r)\) 看计算当前 \(k\) 的贡献
CF1827B2
环和链计数问题
链和单独点的计算方法不一样
- 大于2 的链,先选两个端点(排序后,依次选后面的),然后再隔板法选
- 单独点,单独选出来
gym104270L
随机算法
生日悖论
\[ P \approx 1-e^{-\frac{n(n-1)}{2 N}} \]
近似表达式,\(N=365,n=23\)
小数据可以暴力
CF1835C
Meet in the Middle
判断两个东西想等,把bit的数量减半
CF1835C
博弈论
状态转移dp
有2种选择,A会最大化结果,B会最小化结果。 A选择一个值,B减去这个值或加上这个值 \[ max_{x} \left( min(f_1+x,f_2-x) \right) \] \(f_1,f_2\) 已知, \(x \in [0,k]\) . 把 \(f_1+x,f_2-x\) 看成2个一次函数,那么最小值就是区下面的部分。再取最大值就是他们的交点 \[ x = \frac{f_2-f_1}{2} \] 这个时候 \[ y = f_1 + x = f_1+ \frac{f_2-f_1}{2} = \frac{f_1+f_2}{2} \] 可以证明 \(x\) 不会越出 \([0,k]\) 因为 \(x(n,m) = \frac{x(n-1,m)+x(n-1,m-1)}{2} \le k\) 所有不用考虑取模问题
CF1628D1(2100)
轮到A时候最大化A-B的分数,轮到B的时候最小化A-B的分数。然后可以dp这个A-B
SG定理和NIM游戏
通过对称推导, NIM游戏
CF1823E
二分图思维
每个状态有个对应的点,染2颜色。每次取不同颜色的一点可以。
CF11839E
数据结构
单调栈
处理区间的max和区间的min相关问题
线段树
线段树维护dp的一个维度
CF1842E
动态规划
数位DP
查找小于某个数的个数, 如果算第 \(i\) 个数很简单,那么可以二分.
ABC295F
Set 上DP
从大小 \(n-1\) 的set到 \(n\)
ARC147D TODO
二维dp
枚举两个端点的复杂度过大,可以考虑从一个点走到另一个点的dp
ABC210D
考虑一条路径,把空的块作为参数,然后就可以计算dp. 计算的时候,化简,然后把参数乘到dp里面去
区间dp
考虑贡献,别绕进去
cf1666j
DP状态优化
如果dp状态没法存下值
如果dp的答案很小,那么可以维护答案,和达到答案的所有集合
CF1824C
dp空间优化
答案是下凹函数,可以根据单调性把尾巴pop掉来优化空间
CF1830D
字符串
结论
$a^{inf} < b^{inf} a+b<b+a $
可以用扩展KMP计算
回文数
一个长度为 \(n\) 回文数由前 $$ 个字符决定。因此可以将问题简化为考虑前 $$ 个字符
ABC242E(1200)
个数统计
- 已知 \(S\) ,且\(S,T\) 全是大写字母,统计 \(T\le S\) 的字符串个数。
可以用树状图画出统计路线
1 | ll ans = 0; |
数组排序问题
考虑逆序对个数的奇偶性
某操作不影响逆序对个数的奇偶性。多重数字,可以构造出合适的奇偶性。
ARC136B(1200)
多元方程组
设参数,是的方程组有唯一解。然后分析参数的限制。
ARC135B(1200)
计算几何
仿射变换
判断点在凸包内部
极角排序,然后二分
ABC296G
其他
异或哈希
判断子集包含的等价类
CF1830C
思维点
统计所有子数组的答案和
用子问题拆解,然后dp
只要定义好状态,可以简化很多代码。
ABC242D(1200)
Ad_hoc
某些特殊情况发生的时候,答案可以很容易算出来,根据这个分类讨论
想的时候先搞清楚,什么是关键的条件
AGC062A