DP
二进制拆位CSP-S 模拟32 小Z爱划分 与二进制有关的可以把二进制拆开算贡献,经典trick
NOIP 模拟6 汉谟拉比,有一些 DP 后面的状态可能只需要处理到前面状态剩下的就行
NOIP 模拟7 旅行计划路径上的可拆分问题很多都使用树形DP,可能的状态有:走进去不出来,走进去走出来,从里面走出来
P6775 [NOI2020] 制作菜品 特殊的数据范围 : \(n − 2\) \(≤\) \(m\) \(≤\) \(5000\)
首先,很容易想到贪心:我们先拿最小的,然后不够的拿最大的补,交上去发现过了 \(m >= n - 1\) 的点 考虑如何 做 \(m = n - 2\)。通过之前模拟赛一道题,我们考虑能不能把 \(m\) 拆成 两个 \(n - 1\) 的情况 , 正确性是显然的。考虑如何维护:设其中一个拆分成的集合为 \(S\),那么 \(\sum_{i\in S} d[i] = (|S| - 1) \times k\) 拆出来就是 $\sum_{i \in S} (d[i] - k) = -k $ 可行性背包dp,直接用 bitset 优化即可。
一个非常经典的技巧,部分分里面只有 \(k = n - 1\) 和 \(k = n - 2\) 的一定是先手玩出 \(k = n - 1\) 的方法,然后 \(bitset\) 优化\(dp\) 判断是不是能分成两个 \(k = n - 1\) 的情况。CSP-S 模拟赛35 存钱, P6775 [NOI2020] 制作菜品,
NOIP 模拟11 在空无一物的时光深处 对我来说是困难题,由于正着很难做,所以考虑反着做,就相当于颜色覆盖,设 \(DP[i][j][0/1]\) 表示目前用了后 \(i\) 种颜色,目前在左/右端点,染了为 \(j\) 的长度
NOIP 模拟12 盲盒流水线 猫树分治优化可合并类 DP,这是题解
NOIP 模拟赛14 子序列计数 首先 \(n ^ 3\) 是平凡的,我们考虑优化,因为数列中的数互不相同所以若 \(a_i \oplus a_j \oplus a_k \oplus a_m = s\) 则 \(a_j \oplus a_k \oplus a_m \oplus a_p \neq s\) 我们考虑只枚举最后两个,最后再减去不合法的贡献
NOIP 模拟15 T2 : 二进制数 由于前面不知道,所以直接状压钦定前 \(2^k - 1\) 位,赛时代码
DS
有一点线段树和DP的MIX,多校模拟赛2 T3,对于可以合并的DP可以用线段树动态维护,CSP-S 32 小Z爱优化
NOIP 模拟2 环(ring) 难得一见的分块+根号分治,复杂度一定要平衡
GRAPH
对于链上问题,考虑跟链前缀和,尤其是根链异或和有很好的性质 this
\(Dsu\) \(on\) \(tree\) 真的很有用!有些题可以通过 \(Dsu\) 让原来的暴力复杂度变成 \(nlogn\) 这题 正解是李超线段树合并,但是在 4s 时限内卡不掉 Dsu on tree
有些有关环上的问题直接用 DFS 解决比 tarjan 往往强上很多,DFS的灵活性比 tarjan 强,比如 这个
有些带 \((x - y)^2\) 的图论有很大可能是斜率优化,比如 NOIP 模拟1 舰队的远征
NOIP 模拟6 逃离冰场首先要观察到性质,他到这里一次之后不可能再到一次,可以这样建模:一个点可以走向他的上下左右,步数为2,或者走到这一列或行中最后一个,步数是1。然后跑一个 DIJ 或者 01 BFS 即可
NOIP 模拟8 T2 : 王哥与演出 我们把每一行每一列看做一个点,把饰品看成边,取东西相当于给边定向,然后我们贪心的取,然后判一下是否有环了就可
NOIP 模拟16 T3 : 仙缘 观察到下落相当于掉到离他最近的那个点,将联通块之间连边,再从0向所有最下层的连通块的连边,最后下落的距离就是到这个连通块最短路的长度
MATH
NOIP 模拟12 虫群之心
威尔逊定理: \((n - 1)! \equiv -1 \pmod n\)
由于本题中 \(p - 1000 \leq m\) 我们可以直接暴力除回去就可
STRING
多校CSP模拟赛2 T2,可以用并查集维护字符串相等,相同例题还有CSP前口胡的那套题的T2
NOIP2025 模拟5 选取字符串将 \(\pi[i]\) 和 \(i\) 之间连一条边,构成的树中 \(S_i\) 是 \(S_j\) 的 \(border\) 等价于 \(i\) 是 \(j\) 的祖先
NOIP2025 模拟11 最小字典序 注意到一定是 \(a_i\) |... |\(a_j\) = \(a_i\) 的情况最好,我们考虑从后往前做,维护一个单调栈帮助转移,两个后缀比大小可以用二分(倍增)哈希优化到 单 log
OTHER
多校CSP模拟赛2 T2, 对于一些区间加,并且有关单调性,我们可以考虑对序列进行差分,比如说这一题,我们对区间 \(l(l, r)\) 加一,其实就等价于在查分数组 \(b_{l-1} \gets b_{l - 1} + 1\)并且 \(b_{r + 1} \gets b_{r + 1} - 1\) 即可
结论题一定要打表尝试CSP-S 模拟29 T1
一定要记得,正难则反,考虑所给问题与全集的关系,比如加边变成删边等等
折半报警器也算个经典trick,P7603 鬼街
有一些题需要考虑奇偶性,例如对左右分别进行操作的 this
序列加法机, 这个是贪心好题,通过转化题意然后用二叉堆维护贪心
NOIP 模拟3 变形怪 非常典型,有些 YNOI 的分块也有相关的例子:对一个数开根或者除以一个数次数一定不多,可以直接暴力做
NOIP 模拟4 狗卡 这个也是反着做,我们可以将全部收益减去升级之前的收益,然后维护前缀和平均值最小的一段每次取出来
NOIP 模拟8 T1 : 王哥与荷塘 赛时自己发明了曼哈顿转切比雪夫,维护 \(x + y\) , \(x - y\) 最大值, 最小值即可
NOIP 模拟9 : 卡门 注意到此题的列数量很少,所以可以直接考虑预处理每一列中最后会下降到哪里
NOIP 模拟11 : 白露澈明之泉 非常好玩的构造题,我们考虑把一行填满,然后把剩下没满的全都用这一行填上,但是有的时候可能不旋转的情况下填不满,所以需要多转几次
NOIP 模拟16 :奇巧 要求输出方案且最优的基本上都需要贪心解决。我们发现从后往前跳时不需要多贡献的,那么考虑如何最少的贡献跳到最后面。我们相当于在相交的线段中连边。从一个连通块跳到另一个连通块是需要花钱的,我们按照左端点排序,如果在一个块内就直接跳,否则就要花一部分贡献。