算法竞赛中useful总结

一个技巧结论解决一个题系列

根号分治

  • 对某下标权值做修改
  • 询问 \(\mod x = y\) 的所有下标权值和
  • 操作数小于 \(sqrt(n)\) 用数组存答案,每次修改是 \(\sqrt(n)\) 查询 \(O(1)\), 否则直接 \(\sqrt(n)\) 暴力查询,\(O(1)\) 修改

CF1207 F

求解序列权值为等差数列的前缀和解法。

  • 例如公差为 \(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\)

洛谷 P6216 回文匹配


求解序列的 \(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] 的下标。

洛谷 P4248 [AHOI2013]差异


求解数字串子区间表示数字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。

CF1498 E.Two Houses


最小字符串选取次数,组成目标串结论

  • 给定 \(s,t\) 串,从 \(s\) 中选取可以重叠的子串,最小选取次数组成 \(t\) 串。
  • 结论:匹配到了 \(t\) 串的第 \(i\) 位,往后匹配最长的距离不会使结果变差。

CF615C Running Track


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 是否达到上下界。

Atcoder-ABC138F

一个公式解决一个题系列

组合数公式 $\Sigma_

ABC 154 F

一些题目的思考方向

构造题询问操作次数,可能是根据某种性质然后暴力求解

  • 递增序列,最高位长度不超过 3 的序列是有限的 \(n\leq 100\)

CF1457D


字符串压缩,连续相同的子串压成同一个

  • 考虑 KMP、区间DP。
  • 例如 KMP 优化区间DP

UVA11022


有特殊的边,可以尝试用虚拟点来优化边数

洛谷 P2403 [SDOI2010]所驼门王的宝藏


没有出度为零的点,没有入度为零的点且不可继续缩点的图一定为强连通图

洛谷 P2746 [USACO5.3]校园网Network of Schools


在图中,在每个点有操作,在每个点有不同的状态,转移有不同,考虑分层图 / 拆点

  • 将每个点可以分到若干个状态。

  • 点上的操作,是同点不同层的连接,边的转移是不同点可能不同层之间的转移

ABC164-E 拆点最短路


每次操作值域至少乘 2(x) 倍,可以有暴力对数做法

  • 查询序列中是否存在 \(s[i]=2 * s[i - 1]\),输出下标。

CF992E


查找连续序列和另一连续序列,对应位置加和相等,可以转化为差分数组上匹配问题。

  • 设差分数组为 \(d_i=a_{i+1}-a_i\) ,那么只要 \(|L-1|\) 的差分数组匹配,特殊搞一下第一位元素,就找到了答案。
  • 具体可以用 SA 来做。

洛谷P7769 丑国传说 · 大师选徒

卡常大师之玄学优化

倍增LCA,反转两维,在 \(n\) 较大时极为有用

P2375 [NOI2014] 动物园

posted @ 2022-08-05 17:33  Roshin  阅读(116)  评论(0编辑  收藏  举报
-->