算法竞赛中useful总结
一个技巧结论解决一个题系列
根号分治
- 对某下标权值做修改
- 询问 \(\mod x = y\) 的所有下标权值和
- 操作数小于 \(sqrt(n)\) 用数组存答案,每次修改是 \(\sqrt(n)\) 查询 \(O(1)\), 否则直接 \(\sqrt(n)\) 暴力查询,\(O(1)\) 修改
求解序列权值为等差数列的前缀和解法。
- 例如公差为 \(1\) ,则结果为 \(\Sigma_{i=l}^r a_i*(r-i+1) = \Sigma_{i=l}^r (i * a_i) + (1-l) * \Sigma_{i=l}^r a_i\) 。
- 维护两个前缀和解决, \(i*a_i\) 和 \(a_i\)
求解序列的 \(n^2\) 个子区间最小值之和。
- 定义状态
f[i]
表示前缀 \(i\) 的所有后缀区间的最小值之和。 - 运用于后缀数组中即求
height[]
数组所有区间的最小值加和 - 考虑
height[i]
与height[i-1]
的关系:- 如果 height[i] >= height[i - 1],f[i] 能取到 f[i - 1] 的所有值
- 反之,height[i] 不能取到 f[i - 1] 的值,要往前继续找 小于等于 height[i] 的下标。
- 上点可以用单调栈来维护左边第一个小于 height[i] 的下标。
求解数字串子区间表示数字z是 \(X\) 的倍数的子区间数目
- 结论:\(n \mod X \equiv 0\) 则 \(10^k * n \mod X \equiv 0\)
- 如果 \(X\) 模 5 或者 模 2 都不等于 0,直接做前缀计数即可。
- 否则分类讨论即可 (字符串末尾为 5,0 / 0,2,4,6,8)
ABC158-E 讨论模5和模2
ABC164-D 直接计数
DP 转移类似杨辉三角,可以用组合数优化
-
形如 \(dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1]\), 求 \(dp[n][m]\)
-
设从 \((i,j)\) 出发,可以看做在 \(n-i\) 步往下走中选择 \(m-j\) 往右走。
-
这题需要挖掉 \(i,j\) 相等的点。
CF1629 F2. Game on Sum (Hard Version)
竞赛图经典结论
- 缩点后,DAG是一条“链”状,拓扑序唯一。
- 拓扑序在前的SCC的任意一节点的入度严格小于拓扑序在后的SCC的任意一节点入度,故
- 所有节点按照入度和从小到大排序后,同一个SCC的节点一定是连续的
- 若一个竞赛图按照入度从小到大排序,仅有 \(i=n\) 满足前 \(i\) 的入度和为 \(i*(i-1)/2\),则这个竞赛图缩点后只有一个SCC。
最小字符串选取次数,组成目标串结论
- 给定 \(s,t\) 串,从 \(s\) 中选取可以重叠的子串,最小选取次数组成 \(t\) 串。
- 结论:匹配到了 \(t\) 串的第 \(i\) 位,往后匹配最长的距离不会使结果变差。
y^x \(\geq\) y-x
- 利用结论转换数对 \(y\%x=y\;xor\;\) 转换为 \(y-x=y\;xor\;x\)
- 然后进行数位 dp,找出数对满足二进制位数相同,最高位都为 1,对于每个数位 \(bit_y\geq bit_x\) 。
- 求解方法不是常规数位dp。设计状态 \(dp[pos][upy][downy][upx][downx]\) 记录 x 和 y 是否达到上下界。
一个公式解决一个题系列
组合数公式 \(\Sigma_{i=0}^n{C_n^i * i} = n*2^{n-1}\)
一些题目的思考方向
构造题询问操作次数,可能是根据某种性质然后暴力求解
- 递增序列,最高位长度不超过 3 的序列是有限的 \(n\leq 100\)
字符串压缩,连续相同的子串压成同一个
- 考虑 KMP、区间DP。
- 例如 KMP 优化区间DP
有特殊的边,可以尝试用虚拟点来优化边数
没有出度为零的点,没有入度为零的点且不可继续缩点的图一定为强连通图
洛谷 P2746 [USACO5.3]校园网Network of Schools
在图中,在每个点有操作,在每个点有不同的状态,转移有不同,考虑分层图 / 拆点
-
将每个点可以分到若干个状态。
-
点上的操作,是同点不同层的连接,边的转移是不同点可能不同层之间的转移
每次操作值域至少乘 2(x) 倍,可以有暴力对数做法
- 查询序列中是否存在 \(s[i]=2 * s[i - 1]\),输出下标。
CF992E
查找连续序列和另一连续序列,对应位置加和相等,可以转化为差分数组上匹配问题。
- 设差分数组为 \(d_i=a_{i+1}-a_i\) ,那么只要 \(|L-1|\) 的差分数组匹配,特殊搞一下第一位元素,就找到了答案。
- 具体可以用 SA 来做。