套路题条件反射
First Step
Invariants
Monovariants (increasing/decreasing)
Coloring(cycles/modulo)
Extremal principle
Pigeonhole principle
Enumerative Combinatorics, graph theory
Number theory
Inequalities
Induction(归纳法)
Sequences, Polynomials, Games
Algebra
Problem reduction, Identifying subproblems
Pattern Observation, trying some examples(Getting your hands dirty)
Working Backwards
Exchange Arguments
Draw a picture
Convenient Notation
Guessing
Symmetry
Wishful thinking (What is about the problem that makes it hard?)
Penultimate step(What will yield the solution in a single step)
Polya's mouse(quickly trying all these techniques above really fast, not getting stuck on one approach)
Take down your thinking line on a piece of paper (what clues you get from statement, what qualities you discovered, dp state and tranformations, pictures and graphs to help you see clearly, examples to get your hands dirty ...)
直接想没思路时可以在手动模拟题意的过程中发现规律
- CF732D Exams
二分答案
- P5283 异或粽子
计算xor前缀和,两个前缀xor和的xor表示区间;01trie。
看到xor首先想01trie,再想按位分讨 - 求数列所有子段的最大值和
笛卡尔树
(区间 RMQ \(\to\) 笛卡尔树) - 求坐标系内n个矩形被至少n-1个覆盖的面积
先分别求删掉一个矩形的n-1个矩形之交的面积,再用它们的和减去(n-1)倍n个矩形的交
- n同球置m异盒(n,m≤1e5),盒中球数不能相同,求方案数
先把n减1+2+...+m表示每个盒至少的球从而满足球数不同;则求分拆数P(n,m)=P(n,m-1)+P(n-m,m);最后*m!;
- \(f(i,j)=\sum_{x=j}^{m}\sum_{k=0}^{i-1}f(k,x+1)f(i-1-k,j){{i-1}\choose{k}}\),怎么降复杂度?
https://www.cnblogs.com/impyl/p/15514529.html#part-3-前缀和优化后缀和优化
- CF1612G Max Sum Array
\(\sum_{j=1}^{c_i}(2j-c_i+1)\)
- 状压dp枚举大小pop(s)-1的子集,s=1~(1<<n)的总复杂度是?
\(O(\sum_{i=1}^ni{n\choose i})=O(n2^{n-1})\),容易理解(利用每个位置被选的次数,贡献角度更详尽的解释见帖子第一条reply)
- 求一个无向连通图上两点距离的最大值(直径)(两次BFS是错的)
- 序列 a[n] 有多少个区间它的中位数不小于 x?【区间+中位数】(有时甚至只有【中位数】(Median Pyramid Hard))想二分答案+1-1/01赋值
构造数组b[i]=a[i]<x?-1:1;\(\Sigma bi>0\)表示满足;求顺序对个数即可
- 特别地,如果还想知道按 \(\ge mid\) 01赋值后序列的中位数是否 \(==mid\),可以用 -1,0,+1 赋值。
- 维护一个1~n排列,支持 <=1e5 次 l~r 的排序(升&降),操作结束后询问 a[p]。
将序列01化从而每个操作O(logn)处理;二分a[p]的答案是否>= x并利用[10.]将序列01化
- n的约数集合\(S\)选出一个子集满足对任意的\(u,v\in S(u<v)\),\(u\nmid v\),求子集最大大小
想象每个数向集合里它的倍数连有向边,根据dilworth定理答案等于最小链覆盖,最小链覆盖的求法是每次贪心删完一串
-
\[a\le b\le c\Rightarrow a\oplus c\ge \min(a\oplus b,b\oplus c)\\a\oplus b\ge |a-b| \]
- 二分答案 和 根号分治 就像向量一样,很多时候需要主动去使用
- a1...n是一个点序列,把它分成<=m个子段,求每段的最小圆覆盖,其中最大的半径为R,R最小是多少?
二分答案的check:由于对于一个左端,要找到最右的右端,要做O(n-l)次O(n-l)的最小圆覆盖。对于每个左端,(k从0到log)倍增地枚举区间[j,j+2^k-1],将右端限定在这个区域中二分这个右端;由于一旦找到了右端就break,所以所有调用最小圆覆盖的区间加起来不会超过2nlogn的,总复杂度\(O(n\log^2 n)\)。【“划分成子段”类问题中,如果固定左端点后右端点有单调性,可以考虑倍增右端点所在区间,并在其中二分。】
- 给你 \(n\) 个互不相同的素数集P,请你求出第 \(k\) 小的正整数,使该数字的所有素因子 \(\in P\),\(1\le n\le 16,2\le p_i\le 100,\) 保证答案不超过 \(10^{18}\)。
meet in the middle+二分答案;check():查mid在{ai\(\times\)bj}的排名
- 【随机化法减小复杂度】在平面原点每次随机往任意方向走1单位,n步之后期望位置距离原点 \(\sqrt n\) 单位
- 一个数列的有至少两个众数的最长子段,其中一个众数必然是全局众数
反证法,如果不是,则可以扩大区间
- 【隔板法】n:球数,m:板数(1)板板不为空:C(n-1,m)(2)板板可为空:C(n+m,m)(3)板板可为空,存在t(x>=1)个组球数>=k:\(\sum_{x=t}^{\min(n,m/k)}(-1)^{x-1}C_{n-xk+m}^mC_m^x\)(组合数表示先预留出k个球;容斥表示:记每个组>=k的方案集合为Si,求∪Si)
- a mod b = a mod bc mod b(very useful)
- BIU-Offices
反图最短路,利用BFS+链表的实时删除来O(n+m)求出反图 BFS 树
- 圆方树上维护单点修改和区间查询路径上的 min{圆点权值, 跟方点相连的圆点权值的最小值},怎么办?
不需要维护每个方点的圆邻居的min,只用维护它所有儿子的min,树剖查询路径min后再看一下如果lca是方点的话就和方点父亲的权值取min,树剖维护路径上所有点的min(包括圆点)
- [colorII]一个无向图G(|V|=n)的染色方案合法当且仅当每条边的两端点异色,求对于每个非空子集S=1...2^n-1,对S染色的最少颜色数。
将最少颜色数转化为求用i种颜色对S染色的方案数>0的最小i(那么就容易使用FWTdp)
- [Two Faced Edges]怎么总复杂度O(nm)对有向/无向图G中每条(u,v)判断它是否是u->v的必经边?
从u开始按照邻接矩阵vector里正序和倒序的顺序做两次dfs,会得到两棵dfs树;对于每条u的出边(u,v),如果两次都在dfs树里,它就必经
- 看到关于 大小关系 的计数你想到了什么?
①排序②按照从小到大/从大到小顺序考虑
- [VIP]模数非素如何求解组合数C(n,m)?
设p的不同质因子构成集合P,把1~n中的每个数i的所有属于P的数都除掉得到x,现在x⊥p了,利用fac[i]=fac[i-1]·x,\(ifac=fac^{phi(p)-1}\)求出“阶乘”fac[i]的逆元ifac[i];在int C(int n,int m)中,先求出fac[n]·ifac[m]·ifac[n-m],这时P中的数对答案的影响还没有算在内,还要枚举每一个P中的数t,算出\(t^{c_t[n]-c_t[m]-c_t[n-m]}\) 乘进答案。\(c_t[i]\)表示t在i!中的指数,要预处理。
- DAG的最小路径覆盖数=DAG图中的节点数-相应二分图中的最大匹配数.
- (NOIP%2022.9.30)如果要从一个圆心走到另一个圆心,只能走圆面覆盖的地方,距离为两点直线距离,那么最短路是多少?
\(n\) 个圆相交产生 \(O(n^2)\) 个交点,根据贪心显然中转点只可能是它们,直接跑dij会超时;发现1°一个完全被某一圆面(不含圆周)覆盖的点是无用点,2°去除无用点后点数 ≤ 6n.
- 无向图连通性 dp 的一般处理方式:dp 状态 \(S\),枚举子集 \(T\),钦定 \(T\) 和 \(S-T\) 之间没有边,规约成 \(T,S-T\) 两个子结构。枚举时常常固定某点 \(p\in T\),以避免重复。
- 取对数可以转乘法为加法,从而化为一些常见问题
- 看到“区间两两要么不交要么包含”肯定是要建树(大区间向所有内含于它的小区间连边)
- \(a\oplus b,b\oplus c,a\oplus c\) 构成非退化三角形的充要条件是什么
这个题是xor triangle那题,当时我自己想了一些性质也 A 掉了,但是复杂度比人家多16,荣获全场最慢解,在CF上还差0.04s就会TLE……原因在于我判三角形使用的是a<c&&b<c&&a+b>c而题解区用的是a+b>c&&b+c>a&&a+c>b,是我脑筋没转弯。所以你考虑\(a\oplus b+b\oplus c>a\oplus c\)对于a,b,c的充要条件是什么,手玩一位的8种状况,可知左侧恒大于等于右侧,所以只需要使存在一位左侧大于右侧即可
- 欧拉图中边的 dfs 序黑白交替染色——解决“每个点的邻边颜色不全相同”的构造要求的利器。具体地,将原图通过加源点和加边转为欧拉图(点度为偶)后,在 dfs 找欧拉回路过程中将经过的边依次加入序列末尾,将序列的 1,3,5,... 位置染成黑色,2,4,6... 位置染成白色,对于每个同色边构成的连通块完成题目要求的事情。
- 背包是带删的:比如01背包,求删除每一个物品,最后的 dp 数组。可以看成插入了一个数量为-1、价值为-a[i]的物品,那所有东西都要反过来,+a[i]变成-a[i],j+1变成j-1,原来倒着的循环变成正着来。然后这样的意义是省掉一个O(n)
- CF1750E 【括号序列与+1-1赋值、表达式 \(\max(A,B)\) 的拆解方式】
- 统计问题中有意识地改变求和号位置(同一变量的信息挪到一块),以达到降维
- 选择若干个元素 所选元素的权值中最小的那个是多少,这个问题可以转化为:对于每一个完整包含所选元素集的后缀(按照权值从小到大排序之后),有一个 \(a_p-a_{p-1}\) 的权值,那么由于包含它的后缀的左端点是一个前缀,我们用高维前缀和做一个超集前缀和就可以了。
- 并查集可以用来线性(忽略 \(\alpha\))解决多次的区间覆盖问题,原理是离线并按照覆盖优先级排序(例如,越靠后的覆盖越优先、本题中就是 \(c_2\) 越大的越优先,等),那么优先覆盖的位置从今往后都不更改了,删掉这个位置,可以看成若干个连续段,没个连续段有且只有右端点处是没删掉的,通过并查集维护 find(i) 表示 i 所在的块的右端点,改完就删即可。
- n 个数\(a_i\le 10^9\),每次选择\(i\ne j\)并把 \(a_i--,a_j--\),最后会剩下一个数,最小是多少?
(1)当最大值mx>(sum-mx)时,剩下mx-(sum-mx);(2)当mx≤(sum-mx)时,1°当sum为奇数时,剩下1,2°当sum为偶数时,剩下0
- 串划分题目不妨想想后缀trie
- 关于欧拉图:如果是欧拉图(所有点度均为偶)则可以一笔画;否则需要 (奇度点个数)/2 笔画(有偶数个奇度点)。
- ※ 01串任选一个同色相邻对取反,转化为先把所有奇数(偶数)位取反后,每次操作就是交换两个相邻的数. (AGC004F:推广到树上,“任选两个同色相邻节点取反”转换为二分图染色并取反黑点后“任选两个节点交换颜色”)
- 01串每次可以交换两个相邻的数,把s变成t什么时候有解以及最少几次操作?
01个数对应相等时有解;s和t中第i个1的位置的差绝对值之和
- 一阶差分容斥 \([=x的方案数]=[\ge x的方案数]-[\ge x+1 的方案数]\)(看见区间,或看见 “\(=x\)”,都可从差分角度考虑)
- \(n\) 个数分进若干个集合,size 的种类数是 \(O(\sqrt n)\)
- 子矩阵统计问题使用 \(O(n^2 m)\) 枚举上下边界+双指针
- 数区间问题就两种方法:固定右端点扫描/分治。数区间泛指统计区间的某一信息或统计具有某一特征的区间的问题。
- 当在 dp 过程中发现在 \(i\) 处转移的代价取决于之前选了什么时,可考虑费用提前计算。
- 关于冒泡排序:
- [NOI Online #1]冒泡排序:每一轮冒泡排序的实质是将 \(a_i\) 放到“后面第一个大于”,并将中间的数左移一位。
- Inversion SWAPsort:在排列 \(a\) 的逆上进行冒泡排序,每次交换对应在原排列上为交换 \((i,j)\),使得最初的 \((a_i,a_j)\) 构成逆序对,并且每一组最初的逆序对 \((a_i,a_j)\) 都对应唯一一次交换下标 \((i,j)\) 的操作。
- “某一步不能操作,就输了”——想想有没有可能第一步就让他输(这样就不用考虑复杂的局面变化问题)
- \(p\) 进制下每进位一次,各位数字和 \(d(n)-=p-1\);\(v_p(n!)={n-d(n)\over p-1}\)
- 勇于发现题目是不是二合一、三合一问题
- 数据结构题有区间操作并且可以离线还没有什么好的方法时可以考虑变成二维(时间轴-序号轴),区间变矩形,扫描线
- 询问最终某个数的值,在适当情况下也要主动采用二分答案(如Medium Pyramid和[TJOI2016]排序)
- 遇到利用常规方法难以优化的 dp,可考虑转化为路径计数模型:eg1.f[i][j]=f[i-1][j]+f[i][j-1] eg2.f[i][j]=f[i-1][1]+f[i-1][2]+...+f[i-1][j](如果做k次前缀和,则f[k+1][i]转化为i个球分到k个盒子里的问题,可以为空);[变式]k次前缀异或和
转化后的常见背景:从 (1,1) 出发到 (n,m) 且不能越过 \(y=x\) 的路径数。(解决方法:越过 \(y=x\) 等价于与 \(y=x+1\) 有交点,于是把 (n,m) 对称过去,变成从 (1,1) 到 (n,m) 的路径数) - (常用)二进制数计数从暴力的 \(O(m^22^m)\) 优化到 \(O(m2^m)\) 有时很必要,途径是递推(取出 lowbit)。
- 状压类排列计数的解决办法是设前 i 位的所填数集合为 s,然后考虑 i 处填某数的贡献(算在i头上的),从i-1转移;在正解难想时不要忘记有“全排列+check”的替代方案,其中check怎么写是重点
- (1)状压DP复杂度过高时可先考虑全排列算法
(2)贪心对优化似乎没有优化空间的DP有奇效
(3)从贡献角度考虑问题可以让各位独立,使DP方便进行 - 组合数式子求值题的一般解决办法:(1)考察组合意义,使用DP等方式解决(2)通过各种手段化简
- K大无序对:K*=2转化为有序对
- \(\sum dep = \sum siz\)(从贡献角度考虑,必要时相互转化)
- 【计数】当去重规则麻烦时,用贪心决定出统一策略,就不存在重复了。
- 【计数】二元、“任意前缀都要满足~” 直接转成 \(±1\) 的坐标系走步问题,用组合算
- 如何输出一个多边形内的所有整点?(多边形可能不凸、可能自交)
有一个奇妙的想法:我们拿着一支“取反笔”从多边形的顶点1滑到顶点2、顶点2滑到顶点3、……、顶点k滑到顶点1。取反笔的效果是使以这个点为端点的向下射线上的所有点的颜色取反;最开始整张纸都是白色。
一个简单的例子:
在实现时注意每条线段前闭后开;将线段对应的横坐标范围的每个x
对应的线段下方第一个点打上标记,最后做一个前缀异或和;处在线段上的点可能没统计到,枚举每条线段上的整点得到。 - 多次查询图连通性:想给对象随机hash赋值。(如:每次独立查询删掉\(e_1,e_2,...,e_c\)后图的连通性。做法是给每条dfs树非树边随机赋权,异或到树上路径上,然后查询2^c个子集有没有xor=0的)随机哈希方法很重要,如CSP2022T3
- 看到度数奇偶性想欧拉回路
- 双连通分量具有许多环的性质(比如顺逆时针),无向图定向可以往边双缩点上想
- 以直径中点为根,\(fur_u\) 随深度单调递增(\(fur_u\)为\(\max_{i}dist(u,i)\));因此删掉一个连通块中 \(fur_u\) 最大的点不影响连通性。
- \(d(n)≈n^{1\over 3}\)
- 多次调用 dfs,须先处理出 dfn 从而省去递归的巨大常数
- 期望 dp 可以有取 \(\max\) 的转移
- “代价前 \(k\) 小的选法的代价总和”——超级钢琴类做法:局部上,设计trans表示对于每个要选的种类的下一优方案的转移规则;整体上,设计 由 一个代价总和所对应的各个种类的局部方案 构成的 整体方案 通过更改一两个种类局部方案到达下一优的整体方案的转移规则。(CCO2020 Shopping Plan)
- 【组合】从 \(n\) 个不同的数中依次选出若干个数(不能不选)的方案数:\(g(n)=n(1+g(n-1))\) (因为 A(n,k)=nA(n-1,k-1))
- 树上 greedy 常见套路:从下往上,每个点把自己儿子里贪心配对到只剩下至多一个(点/路径),然后传上去继续做。
- 看到【团】想根号做法(度数 \(k-1\) 的点只有 \(O(\frac m k)\) 个);求大小为 \(k\) 的团可以做到 \(O(m/k\times k^2)\)(用
unordered_map
存邻接矩阵) - 最大团=补图的最大独立集
- 一个字符串的 border序列排序后可以分成 O(log n) 个连续段,满足每段都是一个等差数列。
- 树上博弈的通用解法:考虑链上的策略,再考虑如何推广到树上。 (如果还不够,可以再考察菊花。)将链推广到树的常见思路:直径;同深度的点看成同一下标;距离叶子的最远距离等。
- 可以二分、可以双指针,但都不够优的题目,可以考虑整体二分的结构。(先中间后两边)
- \(q\) 次给定 \((x,y)\),表示对树上 \(x\to y\) 路径上的所有满足 \(z\ge x\cdot y\) 的点 \(z\) 上“挂”的子树中的点打上 +1 的标记(如图所示的蓝色部分,包括路径上的点自己)。输出最终每个点的权值。怎么做?
lca处朝上的子树平凡特殊处理;其余“挂的子树”看成路径上相邻两个点的一个子树加一个子树减的共同结果,因此只需支持路径上打“$\ge v$ 的点子树加!”命令的tag即可;用树上差分,只用打4个tag,然后在dfn上把每个点转换成区间,从左往右扫,扫到一个tag就在树状数组上单点加,然后查询所有以此处为右端点的区间所对应的 node 的 prefixsum(node)
- 如果可以 \(O(1)\) 调用交互库 \(lca(x,y)\) 函数,如何在 \(O(n\log n)\) 且 不dfs 的前提下求出 \(\sum_{x\le y}[lca(x,y)\le x\cdot y]\)?
满足 \(\text{lca}(x,y)\ge x\cdot y\) 的 \((x,y)\) 只有 \(O(n\log n)\) 对
- 差分约束可以自动使等号趋近于取到,从而有时能够实现类似字典序极值的构造问题。
- 问“对每个前缀求出”就将“考虑了前缀 \(i\)”作为 dp 的一维。
- 【组合】一堆推式子后找到一个简洁递推式,然后多组询问时用莫队实现递推。
- 你发现规律了吗?
每一行依据X分割成若干连续段,每个连续段填最左的没被填过的*列*,每个X可以接下来把自己的*列*设成“没填”
- 树的重心:各儿子子树 size 的 max 最小的点,同时也是以其为根的有根树各节点 size 之和最小的点(或说各节点到其的 dis 之和最小的点);树的带权重心(每个点有个权 \(a_i\)):各儿子子树的权值和最小的点,同时也是以其为根的有根树各节点子树权值和之和最小的点(或说各节点到其的 dis(x,i)×a[i] 之和最小的点)。
- 快速找到树的重心(中深度最小的那一个):\(2siz_c\ge n\) 的最深点 \(c\)。
- 树的带权重心形成一条链。
- 询问能否从一个状态变到另一个状态的常见思路:(1)“变”的不变量、单变量(2)如果操作可逆,则约定统一形式,若统一形式一致则可行
- 点权、边权灵活互相转化(通过某种映射)常能巧妙诠释题意。
- “判定+构造”型问题:先考虑怎么判定有解,从有解的条件的本质特性出发发散地考虑构造,在草稿纸上写下零散的思路,尽量想得远一些,整合起来;如果是关于操作次数的构造,可以结合"次数限制很像 \(n\cdot V\)"的角度考虑。
- \(f(n)=f(n/2)+f(n/2-1)(n为偶数);f(n)=f((n-1)/2)(n为奇数)\) 记忆化后是 \(O(\log n)\) 的。
- 类网格图 \(k\) 短路求法:
有一张类网格图,相邻两层中,上一层的每一个点都有至少一条连往下一层的带权边,边都在相邻层之间,每个点的度数是 \(O(1)\) 的。求从位于第一层的起点走到最后一层的所有方案中路径长度前 \(k\) 小的方案的路径长。
- 预处理从最后一行开始到所有点的多源最短路 \(dis\)。
- 初始化一个大小为 1 的 vector,其中存起点。vector 的每个元素代表一种从起点到一个点的走法,记录两个信息:点编号 \(x\)、从起点到此点的路径长 \(w\)。
- \(i:1\to n\),遍历每一行;遍历 vector 内元素到这一行的出边,得到一个新的 vector,里面的点都是这一行的;将新 vector 按照 \(dis_x+w\) 从小到大排序;只保留新 vector 的前 \(k\) 个元素,随后赋值给原来的 vector。
- 同时 dp 总和和方案数时的注意事项:总和中这次转移的贡献要 \(\times f(*,*)\)(方案数)(自己有时写的时候容易漏)
- 森林邻接矩阵的秩等于最大匹配的两倍。
x=max(x+a,b)
类标记满足结合律,但不满足交换律,可以用线段树维护((a,b)和(c,d)合并以后就是(a+c,max(b+c,d)))- 有效位置数只与子树大小有关、看似状态都是 \(O(n^2)\) 的树形 DP 常可用线段树合并优化。(Roads in Yusland; Minimax)
- 交互题 \(O(n\log n)\) 提示想二进制逐位考虑。(NOI2019 I君的探险)
- 区间不同颜色数(无修改):[法1]权值主席树维护前缀 \(i\) 各个颜色最后一次出现位置的桶/[法2]以原序列下标为下标的主席树,到 \(i\) 时将 \(i\) 处 ++,\(las\) 处--,每次查询 \(r\) 的主席树的 \([l,r]\) 和;子树不同颜色数:每个点权值为1,同色点集 dfn 相邻的点将lca权值-1,普通线段树维护区间和;子树\(d\)深度以上不同颜色数(七彩树):按照bfs序加点,每层加一棵主席树,维护dfn区间权值和即可。
- (有向)树的 \(\sum (deg_i-1)\) = 叶子数\(-1\)(证明考虑树链剖分)。
- 长为 \(n\) 的数组的 \(k\) 阶差分数组:将数组看成一个 \(n\) 次多项式的系数,\(k\) 次差分操作的生成函数是 \((1-x)^k\),用二项式定理算出原多项式的每一项对结果多项式的每一项的贡献即可。
- 已知 \(d\) 次多项式 \(B(x)=A(x+\Delta)\),给定 \(A(0),...,A(d),B(0),...,B(d)\),求 \(\Delta\)。
数组 \(A,B\) 的 \(d-1\) 次差分得到的一次函数的横截据之差
- 树上期望 dp 形如 \(f_i=\sum_{j\in neighbour(i)}coef_jf_j+const\),由于四面八方不好处理,常能够通过选取特定的根(比如随机游走终点)并钦定 \(f_i\) 可以写作 \(k_if_{fa_i}+b_i\) 的一次函数形式,代入转移式来自下而上递推 \(k_i,b_i\),最后再根据所有的 \(k_i,b_i\) 从根往下递推出所有点的 dp 值。代替了高复杂度的高斯消元。
- AC 自动机(以及一些特殊图)上高斯消元:主元法降低复杂度。题意:一个包含 \(n\) 个长度同为 \(m\) 的字母串的 AC 自动机,走到一个原 trie 的叶子(其中任意一个字母串的结尾)则停止,每步有 \(p_0\sim p_{25}\) 的概率走到每条出边,问以 \(r_1...r_q\) 为起点的期望游走步数。办法:在暴力 \(O(n^3m^3)\) 高斯消元的基础上,考虑将 \(O(nm)\) 个变量减少到 \(O(n)\) 个。不妨设 \(n\) 个字母串互不相同。对于所有在原 trie 上有不止 1 个儿子的点,将它的儿子中除了“某一个儿子”之外设为一元。将自动机的根设为一元。根据【套路题条件反射-No.100】,元的总数为 \(n\)。从根开始在 trie 上 BFS 递推出每个点用元表示的代数式,对于每个点,其出边指向的点由深度大于和小于它的点构成,而此时深度小于它的点的代数式都已知,根据原 \(E(u)=1+\sum p_iE(son_{u,i})\) 移项可以递推出其“某一个儿子”的代数式。对于 \(n\) 个叶子列出 \(n\) 元方程,复杂度 \(O(n^3)\)。
稳定婚姻问题(比那道题更具普适性):
构造一组带权二分图的匹配,使得对于任意两条匹配边 \((a,b),(c,d)\)(其中 \(a,c\) 为左部点),都有下述命题成立:
- 若 \(L(a,d)\otimes L(a,b)\),则 \(R(d,c)\odot R(d,a)\)。
其中,\(\otimes,\odot\in\{<,>\}\),\(L(a,b)\) 为右部点 \(b\) 对左部点 \(a\) 的权重,\(R(d,c)\) 为左部点 \(c\) 对右部点 \(d\) 的权重。
稳定婚姻问题必定有解。
构造方法:
- 用一个队列存储所有未匹配的左部点。
- 每次取出队首,按照边权 \(\otimes\) 的顺序(例如 \(\otimes = \tt{'>'}\) 表示从大到小)遍历其出边,如果对应的右部点还没匹配则匹配这两个点,并
break
,否则如果它对于该右部点的权重 \(\odot\) 该右部点的匹配点对于该右部点的权重(\(R\)),则拆除原来的匹配边,新建这条匹配边,将原配加入队列,break
。\(a,c\) 为右部点时是对称的。对应于现实问题,就是全是男方沿着未匹配边表白和全是女方沿着未匹配边表白的区别;对应于图论问题,就是要求找一条以什么方向 zigzag 的类增广路(“S”形还是“Z”形)。
- 如何判断一个点在不在边可交叉多边形(或网格图内一段封闭路径)内部?
从该点出发作出一条射线,与多边形边的交点个数为奇则在内部否则在外部。如果与多边形一些边重合,则需要钦定上开下闭来计算。
- 转移有环的带 \(=\min/\max\{\}\) 的 DP 怎么做?当成最短路。
- CDQ 分治当不好处理某一维坐标相等的算重问题时,考虑把点拆成“插入”“查询”两个点,查询的时间在插入前。
- 关于竞赛图的题,可以考虑缩点后是链(主干是链,每个点向后面所有点有边),然后使用基于链(序列)的算法解决。
- 贪心等策略都尝试不通时,要拿出杀手锏——DP!
- 对于点双内的任意两个点 u,v 和任意一条边 e,都存在 u→v 的简单路径经过 e。
- 主席树二分:如何对于一个下标 \(p\) 求最大的 \(x\) 使得 \([p,x]\) 内有 \(\le k\) 个 \(\ge a_p\) 的数?建值域套下标的主席树,在 \(T_{maxa}\) 和 \(T_{a_p}\) 两棵主席树作差的线段树上二分。(哪一维套哪一维以适用不同的情形)
- (1)构造题的常用技巧:递归构造。(2)贪心、构造的常用技巧:考虑下限。
- 判断二分图的右部点中的哪些是最大匹配的必选点:按照常规建图跑网络流,从 \(T\) 开始走目前 \(w=0\) 的边(如果它是反向边说明正向边零流,如果它是正向边说明正向边满流),dfs 到的点中的所有右部点即为非必选点,没被 dfs 到的所有右部点即为必选点。判断二分图有哪些边是最大匹配的必选边:按照常规建图跑网络流,一条边必经当且仅当它满流且端点不在残量网络的同一个强连通分量内。
- 求一个左右部大小相等的二分图左右部各删掉一个点后还能够存在完美匹配的方案数:枚举左部删哪个点 \(u\),若剩下图最大匹配为 \(n-1\),则求剩下的图的最大匹配必选点 \(v\),\((u,v)\) 就不满足条件。
- 网络流建模中,写下最“关键”的“元素”(例如:点、环、组、坐标、\(a_{i,j}\) 等),然后尝试令其中一些充当“边”,另一些充当“点”,来描述“它建起它俩之间的桥梁”的各种关系。(例如:题中两个集合有交,就可以令交集中的元素为边,将所属集合对应的点连边)
- “排列 \(\to\) 排列的逆”这种变换的实质是交换了所有(下标-值)二元组 \((i,p_i)\) 为了 \((p_i,i)\),可通过记录是否交换而快速维护。
- 严格 LIS = 最小非严格 LDS 划分。
- 当你发现计算一处 dp 值非常容易,却苦于对于每一处都计算 dp 值的低效时,你可以尝试这种分治策略;当你发现 dp 值具有单调性时,你也可以往这方面想想,因为如果这些连续段的 dp 值不单调也很难满足一些很好的性质。
- 判断一个数列 p 是否能够划分成 一个上升子序列 和 一个下降子序列 的并,只需判断是否存在 4 个元素 a<b<c<d,使得 pb>pa>pd>pc 或 pb<pa<pd<pc。
- 如何统计包含 No.120 中四元组的子段的数量?
经典数形状问题。先把 \(p_b>p_a\) 的二元组找到,把 \(p_b\) 对应的最大的 \(p_a\) 记作 \(h_b\),然后枚举 \(b\),判断所有 \(d>b,p_d<h_b\) 且 \(d\) 已被 activate 的 \(d\) 数量,然后用 \(p_{b+1}\) 作为 \(p_c\) 去 activate 所有没有被 activate 的 \(d,p_d>p_{b+1}\),然后将其从 set 中删除。
- 尝试利用 \(dp_i\) 的候选值个数充分有限的性质设计记忆化等算法优化 DP。
- 高中数列知识:项是有理数的数列的递推突破口通常是设第 \(i\) 项为 \(p_i\over q_i\)。(直接硬推多半是推不出来的)
- 凡具有某种单调性的题目都可以考虑考察断点,例如一个行、列均单调不降的矩阵可以考察 \(\le k,\forall k\in [1,V)\) 的 \(V-1\) 条分界线。
- 势能 Dijkstra 可处理带负权边的图的最短路问题,复杂度 \(O(m\log n)\),比 SPFA 快很多很多;费用流用此算法,可以做到 \(O(f\cdot m\log n)\)(具体来说是给每个点附一个势能 \(h_i(1\le i\le n)\),要能使得每条负权边 \(u\to v\) 加上 \(h_u-h_v\) 后变成正权边。构造方法是一开始设成拓扑排序的最长路乘以边权值域,每次跑完最短路后将 \(h_i+=dis_i\))。
- 差分约束可以实现图论问题与代数问题的互转——看到负环,可以想到用许多自由变量的取值来操控之;看到差型(不)等式,想到用最短路解决之。
- 若对于输入的长度为 \(n\) 的数组 \(a\),求 \(f(a[l,r])\) 是 \(O(n)\) 的,现欲对 \(a\) 进行分段并最小化段数,使得每段 \([l,r]\) 的 \(f(a[l,r])\) 都 \(\le lim\)。如何在 \(O(n\log n)\) 复杂度内解决?(双指针、直接倍增复杂度都 \(\ge O(n^2)\),无法接受)
对于当前的左端点 \(l\),找最远的 \(r\):考虑一种巧妙的倍增——先依次对 \(k:0,1,2,...\),查看 \(f(a[l,l+2^k))\) 是否符合条件,若不则直接
break
;令 \(k_0\) 为最大的符合条件的 \(k\),然后按照 \(k':k_0\to 0\) 枚举做正常倍增找到 \(r\)。 - 独立集的自然根号:一张 \(m\) 条边的无向图可以被划分为 \(O(\sqrt m)\) 个独立集。
- 用 bitset 支持字符串整体匹配:记录
bitset<N>b[26]
表示每种字符的所有出现位置,依次用位运算支持匹配模式串的下一个字符即可。 - 区间长度要求 \(\ge 3\) 等价于区间长度为 \(3,4,5\)(如果对区间的操作可以拆分成对各小段的操作的综合的话)。
- 完全二分图缩点后的形状:主线为一条链,链中的每个元素仅有如下两种形状:①一个由≥4个点构成的强连通分量,其中左右部点数量均≥2;②若干个并列的同侧孤立点,它们的入边集合相同,出边集合也相同。
- 序列上会做,想要放到树上,可想重链剖分,处理一下缝合处的细节即可。
- 看到跳字想倍增。
- 用二次剩余判定完全平方数:取适量较大奇质数,若 \(\forall k,n^{(p-1)/2}\not\equiv -1\),则 \(n\) 大概率为完全平方数。积性:对于 \(p_0\),若 \(n=n_1\cdot n_2\),有 \(n^{(p_0-1)/2}\equiv n_1^{(p_0-1)/2}\cdot n_2^{(p_0-1)/2}\),因此两个为 -1 的数,其积会被 \(p_0\) 认为是 1,若将 \(\{p_k\}\) 的状态(是-1为1否-1为0)状压,则其积的状态可以通过异或得到,全为0则是完全平方数。