一些 trick 和思考收获
2023.1.7 P1117 优秀的拆分
对于一眼看上去只能直接求解的题可以设置一些节点变为求每个节点的贡献
*2023 7.24 补充:这个 trick 也被称为设置关键点,通常用于区间长度固定或是有下界,每个区间必然跨过若干个关键点,可以考虑预处理关键点信息
*2024 1.11 再补充:其实这个 trick 跟树上撒 \(\sqrt n\) 个点然后预处理点对路径的技巧好像差不多
2023.1.8 P1712 区间
如果题目有好几个条件,满足再求解的顺序可以经常替换,不要只想着满足一个然后根据另外一个求
线段树先考虑能不能标记永久化,如果可以就不要写lazytag
2023.1.19 CF1037H Security
线段树合并可以解决很多有集合包含关系的判断问题
2023.1.19 P4770 你的名字
对于子串统计题,可以转化为统计前缀或后缀最长合法长度再乘起来
2023.2.2 P7518 宝石
需要用的状态较多且存在转移对象即为存储对象时,可以使用倍增
2023.2.6 P4870 甲虫
设计状态时可以考虑反向思考,如最大获得改为最小失去,并且可以外层枚举减少状态
2023.4.4 P9168 人员调度
数据结构比较多的时候先列个表整理一下思路再写
2023.4.13 P3750 分手是祝愿
有的修改操作类似开关灯,只有两种状态,是单向的且可以修改当前节点,倒序做一定能全部关灯,就如线性基
2023 5.18 P5607 无力回天
区间修改的几个技巧:差分,分块
2023 5.22 AT_agc001_e BBQ hard
注意到 \(\binom{x+y}{x}\) 可以理解为从 \((0,0)\) 点走到 \((x,y)\) 的路径个数,因为我们一共要走 \(x+y\) 次,从中选择 \(x\) 次向右走,由此加上对于坐标系的平移便可解出此题。
2023 6.14 P8867 建造军营
计数类题目为了排除重复,一个很重要的思考方向是反向思考,考虑每种情况分别在哪里被统计而不是我们怎么统计,本题中在一个子树内都是军营且子树大小最小的节点处统计,如果有向上连边则一直往上跳到上面统计,只要保证对于每种情况都只有一个统计点即可。
2023 7.24
FMT 本质上是高位前缀和,枚举的位次本质上是维度,所以可以任意交换顺序,max 卷积则是一位前缀和,二者都是对原序列的一种线性变换。
一个关于树的重心的 trick 是它必然是 dfs 序(每个点出现两次)中中位数(或带权)的祖先节点,因此可以做到切除某一子树后 \(\log\) 的复杂度求重心,具体做法为在从当前节点到根的路径上二分。
2023 8.25 CF1503A Balance the Bits
想到一个构造式子不要立马抛弃,先考虑一些无解情况,没有也许就是对的
2023 8.25 CF1503C Travelling Salesman Problem
对于类似旅行商问题这种要走遍所有点求最小花费的问题,更换起点后问题等价,可以选择一个需要考虑的限制/花费种类较小的点
2023 11.9
min-max 容斥中的 \(E(\max x_i)\) 实际上是把 \(G=\max(X_1,X_2\cdots)\) 看作了一个随机变量,其对结果空间的映射等于其他随机变量映射值的最大值。
递推求出 \(E(X^2)\) 可以考虑将平方拆开,假设 \(X\) 表示次数,$E_j = \sum X^2 \prod p_j $,那么从其递推而来的 \(E_i\) 的一部分就等于 $\sum p_{i,j} (X+1)^2 \prod p_j $,拆开 \((X+1)^2\) 后就可以由 \(E_j(X)\) 和 \(E_j(X^2)\) 进行表示
2023 11.10 CF1848F Vika and Wiki
\(\binom{i}{j}\) 为奇数当且仅当 \(j\) 在二进制下为 \(i\) 的子集,可以列出 2 的个数的式子证明
2023 11.26 CF330G Inversion Squared
带平方的计数题要么转化成对每种价值计数,要么计数计数对象的二元组,要么直接拆次方
2024 1.8 NFLS 省选模拟 整除
多项式 \(F(x) \mod x^m-1\) 其实相当于每个项次数对 \(m\) 取模,可以考虑 \(x^m \equiv 1 (\mod x^m-1)\) 因为右边加模数等于左边。
2024 1.11 P4139 上帝与集合的正确用法
求形似 \(c^{c^{c^{\cdots}}} \mod p\) 这种东西可以考虑扩展欧拉定理,设 \(x=(c^{c^{c^{\cdots}}} \mod \phi(p)) + \phi(p)\),其实原柿就是 \(c^x\),然后那一坨再耗下去最终模数会变成 \(0\)。
2024 1.11 CF1830C Hyperregular Bracket Strings
一些相交区间可以转化为若干等价约束的不交并列区间这样的问题,通常有一些区间不交的优秀做法,但是暴力转化是 \(O(n^2)\) 的,有一个技巧是对每个区间中覆盖到的点随机异或上一个值,最后异或值相同的最前和最后两个点看做一个区间,即可不交,然后建树之类的可以用个栈扫一下
2024 1.16 CF1920E Counting Binary Strings
遇到又有边界又有内容的计数时可以设两个状态分别表示辅助转移
2024 1.22 群里问的
异或卷积是高维fft,本质上是在枚举每一维然后做长度为 2 的循环卷积。
2024 3.27 P10284
FHQ treap 合并的时候有个不用保证左边权小于右边的做法,但是会多一个 \(\log V\),题解说可以用势能分析证,设其为 \(\log|a_i-a_{i+1}|\),做法是把左边树按照右边根节点权分裂然后两颗子树于左边树的左右两棵子树合并。
2024 4.6 P5900
\(\text{Euler}\) 变换式子是 \(\text{Euler}(f(x)) = \prod_{i=1} (\frac{1}{1-x^i})^{f_i}\),其组合意义是把 \(n\) 个元素分为若干组,每组方案数为 \(|S|\) 的方案数,式子怎么来的呢?先考察所有组大小都为 \(i\) 的方案数,由于我们有 \(f_i\) 种方案,每种方案的生成函数是 \(\frac{1}{1-x^i}\),而我们只要把所有的乘起来就行。