小记
-
线性基求第 \(k\) 大,先处理 \(p_i\),表示某一位上为 \(1\),其他数这一位是 \(0\) 的数,然后我们就会考虑选与不选,由于只有一个数这一位上有 \(1\),所以就转换成了二进制选取。
-
什么时候线段树合并要新建节点?(更为厉害【湖南集训】)很显然,我不新建节点会导致一些线段树上面的信息改变,一般出现子再查询不同子树所要处理的信息时要用到。
-
为什么模板2-sat要优先选拓扑序更大的?因为他有连边连向他,不能选了前面那个,因为一旦选择前面的,后面的也会被选择。
-
\(C(n,i)·C(i,m)\ne C(n,m)\),因为前者可能存在重复的情况,更合理的是 \(C(n,i)·C(i,m)=C(n,m)·C(n-m,i-m)\),后者成立是因为既选了小的那一部分,又选择了大的那一部分。
-
长度为 \(2n\) 的括号序列,其中有 \(n\) 个左括号和 \(n\) 个右括号,其方案是 \((2n-1)(2n-3)\dots\),解释是考虑第 \(i\) 个括号从后面的匹配,然后删掉这两个已经匹配了的继续匹配即可。
-
概率题可以转化成 \(dp\) 或者计数题目,计数题可以转化成概率题或者 \(dp\),这个非常重要。
-
整体计算复杂时,可以考虑单个点对全局的贡献。
-
一道很典的题目是无向图求任意点对的路径最小/最大值,考虑kruscal重构树之后st表+lca即可。
-
trick(agc052e),像字符串的相邻问题->mod字符集,转化为数字问题比如说差之类的。
-
\[gcd(x,lcm\{a_{1...n}\})=lcm(gcd(x,a_1),...,gcd(x,a_n)) \]
-
一种经典的二进制题目可以考虑将某个数值拆成 \(2^k\times d\) 其中 \(d\) 为奇数,这也好像是
Miller_Rabin的做法。 -
当要判断一个分数是否时有限小数时候,只需要判断分子分母约分过后,分母的质因数分解只有 \(2,5\) 才是有限小数。
-
逐位放括号必须合法,只需要考虑左括号满足:第一个左括号的位置 \(\leq 1\)、第二个 \(\leq 3\)……
-
看到组合数乘上一个数的次幂可以想到用二项式定理化简式子。
-
我们设二元组 \((l,r)\) 表示不存在 \([l,r]\) 的子区间(不为它本身)的 \(\text{mex}\) 为 \([l,r]\) 的 \(\text{mex}\),那么 \((l,r)\) 的个数是 \(2n\) 级别的。
-
区间 \([l,r]\) 的匹配问题,如果包含区间可以忽略或者可以另类计算,那么剩下的按一二关键字排序那么他两个都是满足单调性的。
-
\(\max(f(x))=-\min(-f(x))\)
-
合并石子的最大值可以贪心。转移。(好像最小值也可以用一些另类的贪心做法)
-
算关于二进制的某些贡献的时候,可以考虑拆位进行计算,有时再提取一下公因子可以达到一种出奇制胜的方法。
-
像询问最少进行几次操作达到 \(1\dots,n\),这是每个都要求,应当可以转化为进行 \(x\) 次操作最多可以……,最后进行二分或者什么的都行。
-
对于一些范围过大(\(10^9\) 之类)的计数题,一般可以考虑离散化之后再乘上一些组合系数,这可以帮助我们化简问题。
-
区间范围也可以映射为某些 \([,)\) 的区间。
-
对于一些可以翻转同理的,可以考虑共同进行计算,来达到简化问题的目的。
-
字典序最值问题可以考虑逐位贪心,然后每一位行不行做 \(check\) 就行了。一般这种题目就是要优化这个 \(check\)。
-
题目会有一些限制的时候,不妨先考虑这些限制所带来的情况,然后分类一下,或许能够找到思路。
-
一般一些 gcd 计数问题不是莫反就是设 \(f(d)\) 表示为 \(d\) 的倍数,\(F(d)\) 恰好为 \(d\),然后直接:\(F(d)=\sum_{d\mid n}\mu(\frac n d)f(n)\)。
-
\(\gcd(i,j)\leq i-j\leq i\text{ xor }j\),可以一位一位地去证明。
-
带有特殊性质(我是指题目,不是数据!)的题目,可以通过手玩样例得出哦。
-
一般而言,如果不是题目特殊,DAG(有向无环图)是没有什么性质的,请考虑其他的方法优化你的算法。
-
对于某些括号匹配问题的构造(或者是非法变成合法),可以考虑先将他的左右括号一一匹配然后再进行调整,这个一一匹配可以贪心地将最左边和最右边的调整,然后对于前缀和的问题进一步再讨论。
-
连续段至少或者相等为 \(k\),可以转化为某个区间的平均数至少或者等于 \(k\)。
-
相同值域问题求两边相等可以考虑相反数变成相加然后再加上值域最后可以用容斥解决,具体可以见到CSP模拟赛6 \(T_4\)。
-
一个有趣的数论公式:\(\prod_i1-\frac{1}{p_i^n}=1-\sum_i \frac{1}{p_i^n}+\sum_{i\ne j} \frac{1}{p_i^np_j^n}\dots\),这在莫比乌斯函数的容斥题目中有出奇制胜的效果,不过一般以可以通过 \(\omega(n)\) 来暴力做。
-
动态加边和动态查询两点是否在同一个连通块中可以用并查集按秩合并(不熟悉),存一下边的时间辍,然后查询两个点的时候暴力找这个路径,然后取最大值即可(可以参考http://10.192.20.252/record/68ff7dfd8b4ce0e8981dbac8)。
-
要对直线表达式的dp式敏感,因为可能可以用李超线段树优化。
-
多源bfs一般用于处理多点更新多点的情况,边权为 \(1\) 很重要。
-
对于一些不符合常理的题目,要么就是题目性质,要么就是优化建图。
-
减半报警器trick,可以参考:https://www.cnblogs.com/kncjjdr05/p/18853690,这种trick基于鸽巢原理来进行暴力得到的 \(\mathcal{O}(qk\log V\log n)\) 算法,其中 \(k\) 是报警器的数量。
-
直径的性质trick:新增一个点得到新直径的端点一定在之前的直径的端点出现过,我们一般可以把某个点经过直径的路径拆成这个点到直径中点的路径以及直径的一半。
-
有些求序列的上升下降或者相等可以考虑差分的性质。
-
双端队列放数问题一般可以把这个变成两段单调递减的区间(如果是按大小顺序加入)。
-
注意二进制的左移右移如果超过int都要写1ll。
-
像一些什么方格填数的题目那肯定跟确定某些东东之后整个确定下来脱不了干系。
-
一些式子的规律往往令 \(x=x-1\) 什么之类的。
-
一个最短路 \(u_1\rightarrow v_1\),子路径 \(u_2\rightarrow v_2\),也一定是最短路,且最短路生成图肯定是 DAG(反正无环).
-
我们只关心边的情况的话有时会建反图进行关注。
-
关心有用的状态是对状态数量的优化。
-
对于最值的树上路径 \(x\rightarrow i\rightarrow y\),那么可以拆成 \(x\rightarrow y\) 以及 \(x\rightarrow i\) 两条路径的最值。
-
对于某些算方案数的平方我们可以转化为:两个人在两个独立的情况下搞方案,输出方案相同的方案数.
-
对于判断两个数 \(x,y\) 相乘之后是否是平方数可以考虑令 \(a=n^2\times p,b=m^2\times q\),两者相乘是平方数当且仅当 \(p=q\)!可以通过这个转化为两者相等的问题。
-
01背包的转移是是否将第i个放入,但是我们考虑可以转化为将长度为Len的放入,然后记录一个最后放入的编号最小的,这样就可以转化成另外一种较为简单的问题。
-
计数题目(例如CSP-S2025T4)如果跟原序列无关,我们可以考虑是否将某一个值放到当前的最后一个。
-
还有一类计数题目只跟前一项有关,此时我们只需要考虑当前这一个值后面能跟多少方案即可(abc431T6)。
-
排列计数 dp 通常考虑插入 dp(https://www.cnblogs.com/keysky/p/18680483),其中一种方法是连续子段dp。
-
对偏序关系进行连边可以产生有向图然后拓扑即可。
-
对于某些数和数之间有关系的题目,且选特定的数,可以先钦定为 \(n\) 个特殊值然后按照结果依次排序,排完序后可以设 \(f_{i,j}\) 表示前 \(i\) 个进行了 \(j\) 次前缀运算,或者不是这样也类似这样(AT_arc107_d)。
-
切比雪夫距离:对于两个点 \((x_1,y_1),(x_2,y_2)\),那么他们的距离为 \(\max(x_1-x_2,y_1-y_2)\)。这个通常跟曼哈顿距离进行转化,如将 \((x,y)\rightarrow (x+y,x-y)\) 之后,所谓原来的曼哈顿距离就是现在的切比雪夫距离。而且这个极值可以给我们解决很多问题(P5193和P2906)。
-
分析某一种情况的组合意义时可以考虑将其结果映射到序列考虑相邻/特殊的约束,再进行变换一下就可以得到正确的组合式子。
-
一种经典的图论trick是我们发现点不好转移或者讨论时,我们考虑将边进行编号进行转移/讨论。
-
区间加操作考虑差分。
-
一个经典的trick:考虑深度与路径的关系,例如:\(dep_{lca(u,v)}\) 就是 \(u,v\) 到根节点的路径交点个数。
-
我们套上 \(k\) 次方时也可以考虑差分,然后前缀和一下就是答案,具体的差分就是:\(x^k-(x-1)^k\),有例题:P5305。
-
整除分块的分组思想很重要,分成多少个长度为 \(k\) 的块,再处理剩下的余块。
-
经典外向树的拓扑序个数:\(\frac{n!}{\prod sz_i}\)。
-
最大/最小化不同种类的数可以想想是否跟值域(极差)有关。
-
入栈出栈需要无序变成升序的条件为:入栈元素一定不能比栈顶元素小。
-
复制粘贴加入题可以考虑枚举长度/次数。
-
trick:用 \(lcp(i,j)\) 表示维护 \(i\rightarrow n\) 以及 \(j\rightarrow n\) 的最大前缀去推导某个区间包含 \(k\) 个区间中的子串(不重叠)。
-
博弈论题目一般先考虑最终失败的情况。
-
颜色后来的将会覆盖前面的一类问题可以考虑从后往前,只涂没有涂过的地方的问题,这个还可考虑上一个的有效颜色。
-
比赛技巧:抽离模型(具有代表性)\(\rightarrow\) 分类讨论 \(\rightarrow\) 解决问题。这与做NOIP2024 T2一样的想法。
-
前后缀 \(\gcd\) 的值域是 \(\mathcal{O}(\log V)\) 级别的,也就是所说区间 \(\gcd\) 的值域是 \(\mathcal{O}(n\log V)\) 级别的。
-
相对位置啊!!!
-
前缀和未知情况可以考虑从 \(l-1\) 与 \(r\) 连边意思是知道了 \(S_r,S_{l-1}\) 中的一个,那么另一个就知道了。
-
互为倍数关系可以考虑他们的种类不是很多。其实是 \(\mathcal{O}(\log V)\) 级别的。
-
注意:\((a\text{and} b)\text{xor}(a\text{and}c)=a\text{and}(b\text{xor}c)\)。
-
做题技巧:化简情况 \(\rightarrow\) 进行讨论 \(\rightarrow\) 解决问题。
-
可旋转矩形等特殊图形可以考虑对角线以及两者交点的关系。
-
stable_sort()的空间使用更大,而sort()的更小。 -
区间的打在点上面。
-
区间考虑邻项的关系。
-
对拍!对拍!对拍!其不仅仅只是检查正确性,还可以帮你在大样例过不了是给出小的hack数据!
-
考虑经典套路,如果某一个思考方向不行,我们考虑其他方向。
-
\(dp\) 的转移优化的指导思想就是及时排除不可能的决策。
-
前驱后继去刻画问题很有意思!
-
一种用欧拉路径去图论建模的方法:\(l_i\rightarrow r_i\),然后考虑一些附加边,对于不平衡的度数考虑邻项加边,对于不连通的图考虑求 MST 即可。可以参考的题目:IOI2016railways,还有NOIP2025冲刺最后一场的T2不要 \(l_i<r_i\) 的情况。
-
绝对值可以转化成 \(\max\) 的情况(显然),\(\max\) 也可以转化成绝对值的情况:\(\max(a,b)=\frac{a+b+|a-b|}{2}\),因为 \(|a-b|\) 返回最大值减去最小值,所以最小值被抵消,最大值保留。如果是贪心的话,转化成后面这个就可以直接两个升序算答案即可了。比如说:计算 \(\sum\max(a_i,b_{p_i})\),其中 \(p_i\) 是个排列,那么转化成绝对值之后显然两个都升序计算答案就行了。
树上两点路径求值
路径上求原值->其它值
经典可以用树链剖分。
如果说其它值是求最小可以考虑从小到大排完序后不搞之前跳过的点,可以用并查集路径压缩,每条边将会只经过 \(1\) 次。
求两两位运算的最大值/最小值(有点意思)
首先是 \(n\) 个数。注意这里是两两,不是若干个。
对于与运算
求最大值你会发现你保留的数可以到 \(\mathcal{O}(\log a_i)\),然后两两匹配即可。
设我们的答案为 \(M\),那么对于 \(>M\) 的数最多只有 \(\mathcal{O}(\log a_i)\) 个,因为我们需要保证至少不与我们的最大答案是 \(M\) 的条件不符合。
这种方法的优秀之处在于可以优化我们的候选答案。
求最小值你就只能字典树了,枚举每个数直接字典树找即可。
对于或运算
求最小值感觉是可以像与运算求最大值一样。
求最大值只能用字典树了。
对于异或运算
两者都只能用字典树。

浙公网安备 33010602011771号