2024.12省选集训记录
12.3 模拟赛
T1
显然有 \(O(\frac{n^2k}{w})\) 的做法,暴力枚举 \(i,j\),压位求出 \((a_i\oplus a_j)\bmod 998244353\),计算 \(x\) 次方即可。
完全立方公式:
则有:
平衡一下,\(n\le B\) 跑 \(O(\frac{n^2k}{w})\)。
令 \(L=nk\le 3\times 10^5\)。复杂度:\(\max\{O(\frac{LB}{w}),O(\frac{L^3}{B^2})\}\)
取 \(B=L^{\frac{2}{3}}w^{\frac{1}{3}}\) 得复杂度为 \(O(\frac{L^{\frac{5}{3}}}{w^{\frac{2}{3}}})\)。
只有 \(8\times 10^7\) 左右而且常数巨小。
T2
序列的价值是前缀 \(\max\) 之和。
考虑 dp,\(dp_{i,j}\) 表示前 \(i\) 个数 \(\max\) 为 \(j\) 的价值。
\(dp_{i,j}=\max(\max\limits_{k<j}dp_{i-1,k}+c_j,dp_{i-1,j})\)
有一堆特判,特难写,题解有一个好看的形式:
将值按照还没有出现的分段(对于每个还没有出现的值,往后连续的已经出现的值分为
一段)。
记 \(idx_x\) 为 \(x\) 所处的段,\(v_x\) 为段 \(x\) 段头的 \(c\),\(cnt_x=\sum\limits_{i=1}^x[a_i=-1]\),\(pre_x=\max\limits_{i=1}^x a_i\)。
设 \(f_{i,j}\) 为前 \(i\) 个数,前缀 \(\max\) 在第 \(j\) 段中的最大贡献。
发现 \(f_i\) 恰好只有一段后缀是有值的,
且这一段后缀值单调不降。
因此对于第一种转移,我们只可能从 \(f_{i-1,j-1}\) 转移到 \(f_{i,j}\)。
现在可以考虑数据结构优化,难点在 \(f_{i,j}=\max(f_{i-1,j},f_{i-1,j-1}+c_j)\)。
打表发现,这条转移除了边界位置 \(j=pre_i\),只会走 \(f_{i-1,j-1}+c_j\)。
证明:若 \(f_{i,j}>f_{i,j-1}+v_j\),将 \(f_{i,j}\) 的方案的最大值换成第 \(j-1\) 段的数,大于 \(f_{i,j-1}\),矛盾。
则现在式子是:
可以直接大力平衡树,也可以拆一拆线段树。
这里有 deque 打 tag 的做法:
\(lim\) 表示当前 \(f_i\) 的后缀 \(lim\sim m\) 有值,\(cnt\) 相当于一个偏移量。
打 tag \(+t\) 表示 \(f_{i,j}\) 要加上偏移之后的 \(v_{j'}\sim v_{j'+t-1}\),即这个区间的长度。
由于需要全局取 \(\max\),可以 deque 内部装连续段,\(\operatorname{pop\_front}\) 整段后散段内二分。
12.4 模拟赛
T1
三进制拆位,\(3^5>200\),做完了。
考场想不到的我是什么玩意……当然随机化 \(\sout{90}\) 分也挺抽象。
T2
设当前的集合从小到大是 \(v_{1\dots m}\)。
记 \(\displaystyle pre_i=\sum_{j=1}^i a_j\),\(\displaystyle suf_i=\sum_{j=m-i+1}^m\mathllap a_j\)。

如图,答案是 \([pre_i,suf_i)\) 的并集的长度和。
初始 \(x\) 在认为 \(pre_1\sim suf_m\) 都行。
减去 \(\displaystyle\sum_{i=1}^{m-1}[suf_i<pre_{i+1}](pre_{i+1}-suf_i)\) 就是答案。
令 \(f(x)=pre_{x+1}\),\(g(x)=suf_x\),\(M=\lfloor\dfrac{m}{2}\rfloor\)。
\(f(x)=f(x-1)+v_{x+1}\),\(g(x)=g(x-1)+v_{m-x+1}\)。
发现在 \(1\sim M\) 的区间内, \(v_{x+1}\le v_{m-x+1}\),即 \(\Delta f\le \Delta g\),则这段区间内必定为 \(f\) 大然后 \(g\) 大。
同理有 \(M+1\sim m-1\) 的区间内 \(\Delta f\ge \Delta g\),这段区间内必定为 \(g\) 大然后 \(f\) 大。
所以两个函数图像应该如下:

我们需要计算两端的 \(g\) 更小的部分的 \(f(x)-g(x)\) 的和。
离散化之后上权值线段树维护,可以查询 \(\displaystyle\sum_{i=l}^r f/g(i)\)。
二分出左右两半的断点即可。
\(O(n\log^2 n)\),需要大力卡常。
T3
\(m\) 个点对建无向图,最小环长度是 \(L\),第一问答案是 \(-(m+L-2)-1\)。证明很难,感性理解。
最小环
先 \(O(n^2)\) 求出全源最短路,然后求出全源次短路。
定义次短路 \(sec_{i,j}\) 为与 \(dis_{i,j}\) 初始边不同的最短路。
最小环一定形如 \(dis_{i,j}+sec_{i,j}\)。
即 \(\displaystyle L=\min_{i\ne j}dis_{i,j}+sec_{i,j}\)。
\(dis_{i,j}\) 很好求,直接 \(n\) 次 bfs。
\(sec_{i,j}\) 比较困难。
假设源点为 \(i\) 的最短路树长这样:
那么对于某个点 \(j\),\(sec_{i,j}\) 的路径一定长这样:
如果经过三棵子树 \(T_a,T_b,T_c\),那么一定不如先走最短路进入 \(T_b\) 在进入 \(T_c\)。
我们先找出形如下图的 \(j\),即从别的子树一步就能走到的 \(j\),\(sec_{i,j}\) 是可以确定的。
这样变成 \(\displaystyle sec_{i,j}=\min_{k\in T_j}sec_{i,k}+dis_{k,j}\),其中 \(T_j\) 表示 \(j\) 所属子树。
对每个 \(sec_{i,j}\) 的值开桶,跑 bfs(其实就是 dijkstra 用桶代替堆)。
复杂度 \(O(nm)\)。
这道题的 substack 是有提示性的,一个个讨论。
\(\rule{20cm}{0.05em}\)
\(\large{\textsf{Substack2 环}}\)
需要构造一棵 \(n\) 个点的树。
由第一问结论,这棵树要使得:\(\displaystyle\sum_{i=1}^n dis(i,i\bmod n+1)=2n-2\)。
发现 \(2n-2\) 其实就是每条树边被经过 \(2\) 次。
\(1\to 2\to \dots \to n\to 1\) 的回路只经过每条边 \(2\) 次,边两端的连通块只能形如:

也就是说,令树以 \(1\) 为根,树的每棵子树编号值域都形成连续段。
设 \(1\) 编号最大的儿子为 \(x\),\(x\) 子树内编号值域为 \([y,n]\)。
拆分成 \([y,x]\) 和 \([x,n]\) 两半,这两半也是合法的子树。
于是可以 dp,\(f_i\) 表示 \(i\) 个点的树的方案数。
记辅助数组 \(\displaystyle g_i=\sum_{a+b=i}f_a\cdot f_b\),即可 \(O(n^2)\)。
\(\rule{20cm}{0.05em}\)
\(\large{\textsf{Substack3 仙人掌森林}}\)
直接把环的做法套上去,最小环个数为 \(c\),答案为 \(c\cdot f_L\)。
\(\rule{20cm}{0.05em}\)
\(\large{\textsf{Substack4 杏仁}}\)
杏仁:

设两点间的这些路径长度从小到大为 \(l_1,l_2,\dots,l_k\)。则必有 \(L=l_1+l_2\)。
这时候如果再算 \(c\cdot f_L\),就会出现重复。
比如 \(l_2=l_3\),会算到 \(l_1+l_2/l_3\) 两个最小环。断掉 \(l_1\) 中某一条边,选择剩下 \(m-1\) 条边就会重复。
考虑容斥,设 \(h(a,b)\) 为有两条长度为 \(a,b\) 的路径拼成环,断掉拼接处的两个点的某条 \(b\) 中的邻边,剩下的 \(l_a+l_b-1\) 条边连一棵树的方案数。
算重 \(l_1+l_2/l_3\) 的时候,减去 \(h(l_1,l_2)\) 即可。
类似环的,\(h(a,b)\) 的这棵树要满足子树编号形成连续段。
删去 \(b\) 中的一条边,剩下两半都是环上连续段,那么一定分别包含 \(a\) 的一段前缀和后缀。
枚举 \(a\) 这段前缀的长度,\(h(a,b)=g_{a+1}\),与 \(b\) 无关,之后称为 \(h(a)\)。
\(\rule{20cm}{0.05em}\)
\(\large{\textsf{All 一般图}}\)
称方案 \(G\) 服从于某个最小环 \(R\),当且仅当原图除 \(R\) 上的边都在 \(G\) 中出现。
-
\(G\) 服从的最小环不唯一。
首先有一个结论:两个最小环的交必定为长度不超过 \(\dfrac{L}{2}\) 的路径。
所以 \(G\) 服从的所有最小环的交一定也是长度不超过 \(\dfrac{L}{2}\) 的路径。
进一步地,设这条路径为 \(P\),\(P\) 中属于 \(G\) 的边一定是 \(P\) 的一段前缀和一段后缀。
记 \(Q\) 为 \(P\) 中间不属于 \(G\) 的那段区间,枚举 \(Q\),\(Q\) 两端不属于 \(G\)。
简单容斥,方案数为 \(F(|Q|)=h(|Q|)+h(|Q|-2)-2h(|Q|-1)\)。
直接枚举 \(dis_{i,j}+sec_{i,j}=L\) 的 \(i,j\),\(i,j\) 间的最短路径即为 \(Q\),\(dis_{i,j}=|Q|\le \lfloor\dfrac{L}{2}\rfloor\)。
-
\(G\) 服从的最小环唯一。
对于每个最小环 \(R\),\(G\) 不能包含 \(R\) 中的上一段长度不超过 \(\lfloor\dfrac{L}{2}\rfloor\) 的路径。
容斥计算包含的答案,\(\displaystyle\frac{c}{L}(f_l-\sum_{i=1}^{\lfloor\frac{L}{2}\rfloor}L\times F(i))\)。
最短路、次短路计数非常麻烦,看代码吧。
12.5 模拟赛
T1
不会 SG 被打爆了。
手玩一下,白点的 SG 值是 \(2\) 的(它到子树内最深的叶子的距离 \(+1\))次幂。
复杂度 \(O(n)\)。
T2
记 \(A,B\) 为 \(a,b\) 的前缀和的绝对值,\(Q=|N|\)。
求 \(\max\dfrac{A_i}{P}-\dfrac{B_i}{Q}=\dfrac{1}{Q}\max\dfrac{Q}{P}A_i-B_i\)。
分块,维护块内前缀的 \(A'_i,B'_i\),维护 \(y=A'_ix-B'_i\) 的凸包。
块内直接重构,复杂度 \(O(n\sqrt{n\log n})\)。
用题解的黑科技可以去掉 \(\log\)。
12.6 模拟赛
T1
嗯,dp,太难了。
\(f_{i,j}\) 表示 \(i\) 的子树内,第 \(j\) 步删到 \(i\) 的方案数。
转移类似树上背包:
复杂度 \(O(n^3)\)。
改一下枚举顺序:
发现 \(j\) 可以前缀和优化。
复杂度 \(O(n^2)\)。
T2
首先离散化,\(l,r\) 变成 \(O(n)\) 的级别。
这个并集一定是若干个连续段,考虑统计连续段的左右端点的和。
先按照左端点 \(l\) 排序。
考虑如果 \(l_i\) 成为询问 \([l,r]\) 的连续段左端点的条件:\(\nexists j<i\ \operatorname{and}\ [l_j,r_j]\subseteq[l,r], l_i\le r_j\)。
\(l\le l_j\le l_i\le r_j\le r\ge r_i\) 则有 \(-l_i\) 的贡献。
\(\uparrow\) 场上的想法,因为一开始看成了 \(\displaystyle\bigcup_{i\in[l,r]}S_i\)。
之后 maojun 说,猫树分治。
考场上留下的图片:

我这不是想过吗。
找到跨过询问 \([l,r]\) 的分治区间,跨过分治中心的连续段我场上就会算了。
两边的当时我不会算,后面发现,竟然只需要扫描线……
12.7 构造专题讲题
带判定/最优化的构造:可以先臆想一种无解情况/答案上界,大胆猜测剩下的情况有解/可以构造。
P5811 [IOI2019] 景点划分
有一个 \(n=a+b+c\) 个点,\(m\) 边的连通无向图。
划分成三个导出子图,大小为 \(a,b,c\),使得其中两个连通。
报告无解或构造方案。
\(1\le n\le 10^5\),\(1\le m\le 2\times 10^5\)。
不妨设 \(a\le b\le c\)。
无解情况:存在一个点,删除它之后剩下的连通块大小都 \(<a\)。
QOJ5434 Binary Substrings
构造一个长为 \(n\) 的 \(01\) 串,使得其本质不同子串数量最多。
\(1\le n\le 2\times 10^5\)。
有个显然的上界是:\(\displaystyle\sum_{i=1}^n \min(2^i,n-i+1)\)。
考虑建图,一个长为 \(k+1\) 的串把它前后长为 \(k\) 的前后缀连有向边。
称这个图为 \(G_k\),现在需要找一条正好经过 \(n-k\) 个点的哈密顿回路。
但这个是 NPC,需要一些手法转化。
神秘观察发现,\(G_k\) 的哈密顿回路相当于 \(G_{k-1}\) 的欧拉回路。
输入较少的构造,可以尝试找规律。
CF1916D Mathematical Problem
给奇数 \(n\),构造 \(n\) 个不含前导零的 \(n\) 位十进制数,使得:
- 每个数都是完全平方数。
- 所有数的数字集合相同。
\(n\le 99\)
做法 \(1\);\(n=5\) 的:\(10609,16900,19600,90601,96100\) 规律很明显。
做法 \(2\):\(O(10^{\frac{n}{2}})\) 的暴力跑出 \(n=11\) 。能构造出 \(99\) 个数,\(n\) 更大就往后面加 \(0\) 即可。
CCPC 网络赛 A
定义一个 \(n\times m\) 的 \(01\) 矩阵的权值为:
可以将 \(1\) 向上/下/左/右坠落到底,能得到的不同矩阵的个数。
构造一个 \(n\times m\) 的 \(01\) 矩阵使得其权值为 \(k\)。
\(1\le n,m\le 10^3\),\(1\le k\le 10^9\)。
本质不同的操作只有 \(13\) 种,\(k>13\) 就无解了。
写一个 \(O(2^{nm}nm)\) 的暴力,跑出 \(n,m\le 5\) 的情况。
依次观察 \(k=1\sim 13\) 的构造,推出结论……
图论建模的构造。
P6185 [NOI Online #1 提高组] 序列
CF2026E Best Subsequence
给一个长为 \(n\) 的序列 \(a\)。
求 \(a\) 的一个子序列,使得子序列长度减去“子序列元素 \(\operatorname{or}\) 和的 \(\operatorname{popocount}\)” 最大。
多组数据,\(1\le T\le 100\),\(1\le n\le 100\),\(0\le a_i< 2^{60}\)。
建图,每个二进制位建一个点,序列每个元素向其值为 \(1\) 的二进制位连边。
问题变成最大权闭合子图。
跑网络流即可。
有些构造题会有很大操作自由度或者给很多信息,这时可以强化限制/只利用一部分信息。
增量法/递归构造:先调整少量元素,变成子问题递归求解。
EI 的一道题
给一个 \(n\) 点的无向完全图,每条边权值为 \(0/1\)。
构造一条路径,经过每个点恰好一次,且经过的 \(0\) 边处于路径的前缀。
\(1\le n\le 2\times 10^3\)。
如果题目中的变换方式/信息形式很复杂:尝试构造一些更简单的变换。
CF1696F Tree Recovery
有一棵形态未知的 \(n\) 个点的树。
对于所有 \(1\le i,j,k\le n\),已知 \([dis(i,j)=dis(i,k)]\)。
构造一棵满足条件的树或者判断无解。
多测,\(T\le 200\),\(n\le 100\)。
如果已知 \(u,v\) 有边,\(dis(u,v)=dis(v,w)\),则 \(v,w\) 有边。
\(O(n)\) 枚举 \(1\) 的一条出边,直接 \(O(n^3)\) 搜出一棵树,然后暴力判断是否符合条件。
时间复杂度 \(O(n^4)\)。
CF1764F Doremy's Experimental Tree
有一棵 \(n\) 个点的树,形态未知,定义 \(f(i,j)\) 表示:
- 添加 \((i,j)\) 这条边,后基环树上所有点到环上的距离和。
现在给出所有 \(f(i,j)\),还原这棵树。
\(n\le 2\times 10^3\)。
逆天观察:\(\dfrac{f(i,i)+f(j,j)-2f(i,j)}{n}=dis(i,j)\)。
然后就变得和上面那题一样了。
CF1444D Rectangular Polyline
给定 \(n\) 条水平线段,长度依次为 \(l_1,l_2,\ldots,l_n\) 和 \(m\) 条竖直线段 \(p_1,p_2,\ldots,p_m\)。
构造方案使竖直和水平线段交替首尾相接并形成闭合图形,且不在除端点外的其它地方有交点。
多测,\(T\le 200\),\(1\le n,m,l_i,p_i\le 1000\),\(1\le \sum (n+m)\le 1000\)。
首先要 \(n=m\),否则无解。
可以强行让图形变成凸的。
然后肯定是:
状物。
然后发现可以省略一些方向,\(\nearrow\swarrow\) 就够了。
于是需要:行和列的长度数组划分为两个集合,使得长度和一样。
设划分之后行为 \(A,B\),列为 \(C,D\)。
考虑 \(|A|=|C|\) 的情况:
把 \(C\) 从大到小填,\(A\) 从小到大填,填出来会是一个上凸壳,然后 \(B,D\) 填出一个下凸壳,必定无交。
\(|A|\ne |C|\) 的情况,就把多余部分填入上下凸壳中间就行啦。
[ARC175E] Three View Drawing
一个正方体被分成了 \(N\times N\times N\) 的小正方体,请你从中选出 \(K\) 个小正方体,使得这 \(K\) 个小正方体构成的立体图形的三视图完全相同,并且三视图中均没有两个小正方体相互遮挡。
$ 1\le N\le500 $,\(1\le K\le N^2\)。
考虑三元组 \((a,b,c)\),不全相等,\((a,b,c),(b,c,a),(c,a,b)\) 能够不影响答案。
于是 \(\lfloor\dfrac{K}{3}\rfloor\) 组就搞定了。
剩下的 \(K\bmod 3\) 组用 \((a,a,a)\) 状的去填。
然后 \(N\bmod 3\ne 0,K\bmod 3=2\) 的情况舍弃一个 \((a,b,c)\),换两个 \((a,a,a)\) 即可。
P7115 [NOIP2020] 移球游戏
ICPC 上海站 H
12.7 树上问题专题讲题
\(\large\textbf{\text{树的重心}}\)
P3345 [ZJOI2015] 幻想乡战略游戏
结论:带权重心只和点权有关。
记 \(s_u\) 为 \(u\) 子树内点权和,重心移动 \(u\to v\) 代价 \(w_{u,v}\times(s_u-2s_v)\)。
结论:带权重心 \(x\) 满足 \(sum\le 2s_x\) 且 \(x\) 深度最大。
其中 \(sum\) 是所有点权值和。
拍扁 dfn 用线段树随便维护即可。
带权距离和非常无聊,拆一拆式子随便 DS 维护即可。
某联考 NOI 模拟赛 T2 seefood
给 \(n\) 点的带点权的树。\(q\) 次操作,操作如下:
- 路径点权加。
- 子树点权加。
- 查询最深重心。
\(1\le n,q\le 2\times 10^5\)
根据上一题的结论,需要找的是 \(2s_x>sum\) 的最深节点。
树剖 + 线段树可以维护 \(s_x\)。
一个神奇的做法:假如我们知道重心是某个点的祖先,可以在这个点上倍增找到重心。
然后拍扁 dfn,观察到 dfn 最小的满足 \(2s_x>sum\) 的点一定是重心的后代。
直接线段树上二分就可以找到它了。
时间复杂度 \(O(n+q\log^2 n)\)。
[CSP-S2019] 树的重心
给定一棵树,求每条边割断之后的两棵树的重心编号和之和。
\(1\le n\le 3\times 10^5\)。
先取整棵树的重心作为根 \(rt\)。
考虑点 \(x\) 作为重心的次数:
显然割掉的边在 \(x\) 子树外。设割掉一条边后,另外一棵树的大小为 \(S\)。
由于 \(x\) 是重心,有:\(2\times(n-S-s_x)\le n-S\),令 \(g_x=n-S-s_x\)
则有 \(n-2s_x\le S\le n-2g_x\),用 \([L,R]\) 表示这个范围。
简单 DS 维护一下,假设 \(S\) 的根到其父亲的边被割掉了,拍扁 dfn + BIT 维护,容斥一下即可。
还要考虑 \(rt\) 作为重心的次数,简单讨论一下即可。
时间复杂度 \(O(n\log n)\)。
CF1842F Tenzing and Tree
给一棵 \(n\) 个点的树,可以把 \(k\) 个点染成黑色。
定义一条边的权值为这条边两侧黑点数量的差的绝对值。
对 \(k=0\sim n\) 求解:染色后边的权值和的最大值。
\(1\le n\le 5000\)。
设某一侧有 \(x\) 个点,则边的权值为 \(|k-2x|\),绝对值非常麻烦。
假设我们知道黑点的重心 \(w\),以它为根,发现 \(2x\le k\),可以拆绝对值。
枚举 \(rt\),现在问题变为 \(\sum(k-2x)\) 最大,也就是最小化 \(\sum x\),贪心选择深度小的点。
如果 \(rt\) 不是重心,那么拆的绝对值是负数,答案一定不优。
可以直接 bfs 求解(这个傻子竟然一开始想 dfs 然后桶排)。
时间复杂度 \(O(n^2)\)。
\(\large\textbf{\textit{dsu on tree}}\)
CF600E Lomsat gelral
有一棵 \(n\) 点的树,点有颜色,对每个子树,求所有出现最多的颜色的和。
\(1\le n\le 10^5\)。
非常简单题,dsu on tree 合并颜色出现次数即可。
换静态链分治,空间 \(O(n)\),时间复杂度 \(O(n\log n)\)。
CF1767F Two Subtrees
有一棵 \(n\) 点的带点权的树。\(q\) 次询问:
给出两个可能有交的子树,求这两个子树中所有的点权的最小众数。有交的部分算两次。
\(1\le n,q\le 2\times 10^5\),时限 \(9s\)。
题解区怎么一堆 \(O(n^{\frac{7}{4}})\) 的高维莫队……
dsu on tree 结合莫队有一个非常牛的 trick:
拍扁 dfn,轻儿子优先访问,dfn 的区间用类莫队的端点移动,移动次数 \(O(n\log n)\)。
这样得到一个 \(O(n\log n)\) 的操作序列,缩成 \(O(n)\) 的带权序列(区间序列)。
在这些带权的序列跑莫队,值域分块平衡一下,时间复杂度 \(O(n\sqrt{q}\log n+q\sqrt V)\)。
回滚神秘手法可以 \(O(n\sqrt{q\log n}+q\sqrt V)\)。
P9021 [USACO23JAN] Subtree Activation P
给一棵 \(n\) 个点的树。
每个顶点最初都是关闭的。一次操作可以切换某个点的状态。
求满足以下条件的操作序列的最小可能长度:
- 对于每个点,都有一个时刻,开启的顶点的集合恰好是该子树中的顶点。
- 在操作完之后,每个顶点都是关闭的。
\(1\le n\le 2\times 10^5\)。
根据 dsu on tree,答案是 \(O(n\log n)\) 级别的。
建一个新的点 \(0\) 表示全关闭状态,\(i\xleftrightarrow{siz_i}0\),\(i\xleftrightarrow{siz_{fa_i}-siz_i}fa_i\)。
问题转化为选择边集使得边集为欧拉回路,且边权和最小。
树形 dp,\(dp_{x,0/1,0/1}\) 表示 \(x\) 是否与 \(0\) 连通,\(x\) 的度数奇偶性,的最小代价。
复杂度 \(O(n)\)。
\(\large\textbf{\text{树哈希}}\)
假设 \(x\) 的儿子是 \(son_{1\dots k}\),使用如下哈希 \(h(x)\):
其中 \(s\) 是常数,表示加上偏移量;\(f\) 是随机函数。
好处就是支持换根。
\(\large\textbf{\text{树链剖分}}\)
\(\textbf{\text{重链剖分}}\)
……
\(\textbf{\text{长链剖分}}\)
核心:子树深度最大的儿子作为重儿子。
性质:
- 从根节点到任意叶子节点经过的轻边条数不超过 \(O(\sqrt n)\)。
- 一个节点的 \(k\) 级祖先所在长链长度一定不小于 \(k\)。
- 每个节点所在长链末端为其子树内最深节点。
- 所有长链的长度和是 \(O(n)\) 的。
CF1009F Dominant Indices
给定一棵以 \(1\) 为根,\(n\) 个节点的树。设 \(d(u,x)\) 为 \(u\) 子树中到 \(u\) 距离为 \(x\) 的节点数。
对于每个点,求一个最小的 \(k\),使得 \(d(u,k)\) 最大。
\(n\le 10^6\)。
长链剖分优化 dp。
\(\large\textbf{\text{点分治}}\)
……
P7782 「MCOI-Zero / AC6-M03」 Sipli Field
给一棵 \(n\) 点的树,有限制 \([L,R]\)。
对每个点 \(x\) 求:有多少经过 \(x\) 的路径,长度在 \([L,R]\) 内。
\(1\le n\le 10^6\)。
点分治,BIT 维护,双 \(\log\) 需卡常。
神奇标算单 \(\log\),但是我们 BIT 换前缀和,然后容斥,也是 \(O(n\log n)\)。
P4886 快递员
给一棵 \(n\) 个点的带边权树和 \(m\) 对点对 \((a_i,b_i)\)。
求 \(\displaystyle\max_{i=1}^m dis(x,a_i)+dis(x,b_i)\) 最小的 \(x\)。
\(1\le n,m\le 10^5\)。
另类的点分治题目:
先取一个点 \(x\) 计算其答案,接下来我们发现可能的答案一定在 \(x\) 的某个子树内,递归该子树求解。
只要 \(x\) 选择的是重心,时间复杂度就是对的。
观察当前 \(x\) 的权值最大的路径。
如果它跨过 \(x\) 那目前就是最小值;否则就在 \(x\) 的某个子树,递归求解。
时间复杂度 \(O(m\log n)\)。
\(\large\textbf{\text{点分树}}\)
某联考 NOI 模拟赛 T2 偷笑
给一棵 \(n\) 个点的带边权树,每个节点初始为黑点。
\(q\) 次操作:
- 询问到离 \(x\) 最近的白点的距离。
- \(x\) 的颜色黑白反转。
- 修改边 \((x,y)\) 的边权。
\(1\le n,q\le 10^5\)。
点分树,来自原先子树一定不优。
在点分树上暴力跳祖先,实时维护子树内每个点到它的距离和它到最近的白点的距离。
每个点建一个线段树,下标是这个连通块遍历的 DFS 序。
前两个操作暴力跳祖先维护,第三个操作在每个涉及到的节点上是一个区间加。
时间复杂度 \(O(q\log^2 n)\)。
\(\large\textbf{\text{树形}}\large\textbf{\textit{dp}}\)
\(\textbf{\text{树上背包}}\)
每次合并时 \(O(siz_u\times siz_v)\) 合并,总复杂度 \(O(n^2)\)。
LOJ160 树形背包
直接暴力背包,\(O(nW^2)\)。
按照 dfn 做背包的方式:
\(dp_{i.j}\) 表示已经考虑了第 \(i\) 个及在它后面 dfs 的所有节点,选出的重量为 \(j\) 的最大价值。
转移:
- 不选,那么也不能选 \(i\) 的子树,所以由 \(i+siz_i\) -
- 选,由 \(i+1\) 转移。
时间复杂度 \(O(nW)\)。
P6326 Shopping
怎么又是你……
牛客186E 旅行
给一棵 \(n\) 个点的带点权的树,和一个常数 \(k\)。
\(m\) 次询问树上一条链中,有多少种方案选一个点集使得点权和为 \(k\) 的倍数。
\(1\le n,m\le 2\times 10^5\),\(2\le k\le 50\)。
\(\textbf{\text{一些其他树上}}\large\textbf{\textit{dp}}\)
[ICPC2022 Jinan R] DFS Order 2
给一棵 \(n\) 个点的树,对每个点 \(i\) 求在所有 dfs 序其是第 \(j\) 个点的方案数。
\(1\le n\le 500\)。
P8935 [JRKSJ R7] 茎
\(\large\textbf{\text{计数问题}}\)
P8329 [ZJOI2022] 树
CF917D Stranger Trees
[ARC087F] Squirrel Migration
给一棵 \(n\) 个点的树。
排列 \(p\) 需要使得 \(\sum dis(i,p_i)\) 最大。
求满足条件的排列的个数。
\(1\le n\le 5000\)。
考虑每条边的贡献,最多被通过次数是两侧点的数量的最小值的两倍。
找一个重心,如果每个点都对应的是重心的不同子树的
话,发现能够达到上界。
问题转化为:点有颜色,在二分图上匹配,除重心外每个点不能匹配和自己颜色相同的点,求方案数。
经典容斥问题,要求恰好 \(0\) 个人匹配自己的颜色,转换成钦定,依次考虑每个颜色,做背包就行。
复杂度 \(O(n^2)\)。
CF724F Uniformly Branched Trees
给 \(n,d\),求有多少种 \(n\) 个点的不同构的树满足每个点的度数为 \(1/d\)。
给定模数 \(mod\),保证为质数。
\(1\le n\le 1000\),\(2\le d\le 10\)。
BZOJ4771 七彩树
给定一棵 \(n\) 个节点的树,每个节点有一个颜色 \(c_i\)。
\(m\) 次询问,\(x\) 子树内与 \(x\) 距离不超过 \(d\) 的节点的颜色数。
强制在线
\(1\le n,m\le 10^5\)。
trick:\(x\) 的最近子树包含关键点的祖先,可以取 \(x\) 与其 dfn 前后的关键点的 \(\operatorname{lca}\) 深度更大的。
同样的套路也用于 CF1648E Air Reform。
其实这个套路的真实情况是这样的:虚树差分。
加入深度限制,变成在线二维数点,主席树即可。
时空复杂度均为 \(O(n\log n)\)。
[AGC023F] 01 on Tree
某联考 NOI 模拟赛 T1 颜色
给一棵 \(n\) 个点的树,边有颜色。
\(q\) 次操作:
- 修改边 \((x,y)\) 的颜色。
- 查询 \(x\to y\) 的路径是否颜色互不相同。
强制在线
\(1\le n,q\le 10^5\)。
可以转化为:求出现次数为奇数次的颜色个数。
欧拉序,用一段区间中仅出现一次的表示
树上的一条链,两次的会被 \(\operatorname{xor}\) 掉。
单点修改,区间查询出现次数为奇数次的颜色个数,强制在线。
分块套 bitset,\(O(n\sqrt n+\dfrac{nq}{w})\)。
不会高级的树分块……
某联考 NOI 模拟赛 T2 失眠
给一棵 \(n\) 个点的带点权的树。
对于 \(0\le x\le \sum a_i\),求权值和为 \(x\) 的独立集个数,对 \(10^9+7\) 取模。
\(n\le 100\),\(\sum a_i\le 10^5\)。
据说原题模数 \(\sout{998244353}\),多项式 \(\sout{O(nV\log V)}\) 直接冲过。
点分树上状压,\(O(n^2V)\)。
进行神秘优化可以 \(O(n^{\log_2\!3}V)\)。
12.8 模拟赛
T1
确定 \(x\) 之后,设 \(y\) 为最小的非负数满足 \(\displaystyle y\le\sum\lfloor\frac{x+y}{a}\rfloor\)(其实一定取等),需要 \(x+y\ge m\)。
令 \(z=x+y\),有 \(\displaystyle z-\sum\lfloor\frac{z}{a}\rfloor\ge x\),且需要 \(z\ge m\)。
即检验是否存在 \(x\le z<m\) 满足 \(\displaystyle z-\sum\lfloor\frac{z}{a}\rfloor\ge x\)。
对于 \(z<m\) 考虑:设 \(\displaystyle w=z-\sum\lfloor\frac{z}{a}\rfloor\),必有 \(w\le z\),则 \(x\le w\) 的 \(x\) 不行。
则有 \(x=\displaystyle \max_{0\le z<m}(z-\sum\lfloor\frac{z}{a}\rfloor)+1\) 时最优。
set 维护一下未被支配的点,就能知道最大值位置,支配的同时修改,BIT 维护。
时间复杂度 \(O((n+m)\log n)\)。
看啊这个唐诗被卡常了,他单点删除查前驱后继又使用了 set!
换并查集,复杂度不变,但是瓶颈变成常数小的 BIT。
T2
我超,原!
12.9 模拟赛
T1
首先我们不关心颜色的种类,只关心颜色数。
\(dp_{i,j,k,0/1}\) 表示 \(i\) 子树内有 \(j\) 种颜色,关键点颜色数为 \(k\),\(i\) 是否与子树内关键点颜色相同的方案数。
能获得 \(n\le 300\),但是这个做法肯定没前途,都没有使用 \(k\le 80\)。
发现考虑儿子太蠢了,每个点只限制不和父亲颜色相同。
\(k\le 80\) 到底怎么用啊,二项式展开搞不出来啊。
~不会是拉插吧,但是 \(\sout{m\le 10^5}\) 啊。不会是多项式快速幂吧。~
根本不会,这也太难了。
T2
谁教你把签到放 T2 的?
考虑割断两条树边之后的决策:


割断了红色的边,蓝色的边要割断,绿色的不割断。
第二种情况显然红边挨着更优,于是就非常好处理了。
接下来只考虑第一种情况。
删左侧的边,左侧蓝边+绿边数量已定,求右侧连向左侧子树内的非树边的最多的点(绿边尽量多)。
换一个方向统计,需要求左侧子树内连向右侧最多的的点。
dsu on tree 或者静态链分治,树剖+线段树(链加全局 max)。
时间复杂度 \(O(n\log^3 n)\)。dsu on tree+树剖+zkw 的常数……
T3
结论:排序之后回文浓度最大。
因为 \(\displaystyle\sum {cnt_i+1\choose 2}\) 一定最优。
现在考虑:要让任意两个相同字符中间都回文。
最简单的就是各自组成连续段,以下情况可以混合:
- \(cnt_a=cnt_b\),则可以 \(abab\dots ab/baba\dots ba\)。
- \(cnt_a=cnt_b+1\),则可以 \(abab\dots aba\)。
- \(cnt_a=2\),则可以用 \(a\dots a\) 包住一段回文串。
先不考虑 \(cnt_a=2\) 的,\(dp_{i,j}\) 表示有 \(i\) 段 \(abab\dots ab\),\(j\) 段 \(abab\dots aba\) 的方案数。
然后枚举 \(cnt_a=2\) 的数的用途:
- 包住空气。
- 包住一个 \(abab\dots aba\) 型段。
时间复杂度 \(O(k^5)\),常数巨小。
12.10 dp 专题讲题
Codechef COUNTSEQ2
给定 \(n,m\),对于 \(0\le k\le m\),计数序列 \(a\) 满足:
- \(\displaystyle\sum_{i=1}^m a_i=n\)
- \(\displaystyle\prod_{i=1}^m i^{a_i}\equiv k\pmod m\)
多组数据,\(1\le T\le 40\),\(1\le n\le 10^9\),\(2\le m\le 40\)。
扩展欧拉定理,\(i^{a_i}\equiv i^{a_i\bmod \varphi(m)+\varphi(m)}\pmod m(a_i\ge \varphi(m))\),于是 \(a_i\) 可以变成 \(O(m)\) 的。
直接 dp,\(dp_{i,j,k,l}\) 表示前 \(i\) 个数,和为 \(j\),乘积为 \(k\),在循环内的点数为 \(l\) 的方案数。
时间复杂度 \(O(m^5)\)。
CodeChef COMPRBLEGRID
有一个 \(2\times n\) 的矩阵 \(a\),数字互不相同,每次操作可以交换相邻两个数。
对于一个 \(01\) 串 \(s\),\(f(s)\) 为最小的操作次数使得能满足 \(\forall i,[a_{i,1}<a_{i,2}]=s_i\)
求所有 \(2^n\) 种 \(s\) 的 \(f(s)\) 之和。
多组数据,\(1\le T\le 20\),\(1\le n\le 50\),\(1\le \sum n\le 100\),\(1\le a_{i,j}\le 2n\)。
\(f(s)\) 有个显然的上界是 \(n\)。
若第 \(i,i+1\) 列都需要交换,连边 \((i,i+1)\),考虑极大连通块 \([l,r]\),暴力交换需要 \(r-l+1\) 次。
于是转为判定是否能 \(r-l\) 次横着的交换完成,可以 dp 判定,区间 dp,状态记录 \(l,r\) 列的状态。
时间复杂度 \(O(n^5)\)。
TopCoder 17778 WeighCoins
有 \(n\) 个硬币,其中恰有 \(1\) 个是假币,假币与真币重量不同。
现在称了 \(m\) 次,每次有两堆数量相同的硬币,能获得总重量的大小关系。
需要找出假币,并求出假币与真币重量的关系。
求最劣情况下,还需要额外多少次称量(称量规则一样)。
\(3\le n\le 62\),\(0\le m\le 50\)。
如果某次全部返回了相等,那么我们只关心那些可能是假币。这是简单的。
否则有不等关系,我们关心某个点若是假币,则它比真币重/轻。
直接 dp,状态记录有多少可能比真币轻/重的假币。
转移暴力 \(O(n^4)\) 枚举,时间复杂度 \(O(n^6)\)。
GYM 103627K Fake Plastic Trees 2
给一棵 \(n\) 个点的带点权的树。
给区间 \([L,R]\)。对于 \(0\le i\le k\),求解:
是否能够断掉 \(i\) 条边使得剩下 \(i+1\) 个连通块内点权和都在 \([L,R]\) 内。
\(1\le n\le 10^3\),\(k\le 50\),\(L,R\le 10^{18}\)。
CF1290F Making Shapes
给定 \(n\) 个向量,满足任意两个向量不共线。你需要按照如下方式画图:
- 初始点在 \((0,0)\)
- 选择一个向量,从当前点连向当前点加上这个向量得到的点
- 重复第二个操作,最后回到 \((0,0)\) 并停止。
这样你可以得到一个多边形,问有多少种画法使得得到一个凸多边形且最终的多边形可以被放到 \(m\times m\) 的矩形里。输出答案对 \(998244353\) 取模。
\(n \le 5, m \le 10^9 , |x_i|,|y_i| \le 4\)。
trick:数位 dp,状压是否满足限制。
QOJ6194 Knapsack Problem
QOJ7301 Even Three is Odd
给 \(w_{1\dots n}\),求:
\[\sum_{x\in[n]^n}\prod_{i=1}^{n-2}w_{\max\{x_i,x_{i+1},x_{i+2}\}} \]\(n\le 2000\)。
暴力 dp,记录 \(i,i-1\) 哪个较大,以及较大值,时间复杂度 \(O(n^3)\)。
前缀和优化,时间复杂度 \(O(n^2)\)。
[AGC058F] Authentic Tree DP
给一棵 \(n\) 个点的树 \(T\),定义 \(f(T)\) 为:
- \(|T|=1\) 则 \(f(T)=1\)。
- 对于边 \(e\),称 \(T_{e,1}\) 与 \(T_{e,2}\) 为切掉这条边形成的两棵子树,\(\displaystyle f(T)=\frac{1}{|T|}\sum_{e}f(T_{e,1})f(T_{e,2})\)。
求 \(f(T)\bmod P\)。
\(n\le 5000\)。
如果 \(\dfrac{1}{|T|}\to\dfrac{1}{|T|-1}\),则 \(f(T)=1\),考虑 \(f(T)\) 的组合意义。
注意到 \(x^{-1}=(x+P)^{-1}\),将每条边中间拆出一个点,然后挂 \(P-1\) 个叶子。
那么 \(f(T)\) 就是每个点赋随机权值,每条边中间的点权大于所有邻点的概率。
容斥,钦定为内向/外向树森林,做 \(O(n^2)\) 背包 dp。
[ARC157F] XY Ladder LCS
每 \(3\) 个数一定能匹配 \(2\) 个,所以答案至少 \(\lfloor\dfrac{2n}{3}\rfloor\)。
所以任意两个匹配字符距离不超过 \(\lceil\dfrac{n}{3}\rceil\)。
时间复杂度 \(O(n2^{\frac{n}{3}})\)。
CF1434E A Convex Game
显然每个序列的 SG 值都是 \(O(\sqrt V)\) 级别的。
dp,记录最后选取的元素和最后两个元素的差。
交换值域,\(dp_{i,j}\) 表示最后选取 \(i\),SG 值为 \(j\),最后两个元素的差的最大值。
需要 DS,区间取 max 单点查,并查集即可。
复杂度 \(O(n\sqrt V\alpha(n)+nV)\)。
CF1519F Chests and Keys
假设开启箱子的集合为 \(S\),\(T\) 为 \(S\) 需要的锁的集合,\(\displaystyle \sum_{x\in S}a_x\le \sum_{x\in T}b_x\),Hall 定理形式。
直接 dp 构造即可。
复杂度看具体实现。
QOJ4811 Be Careful
12.10 网络流专题讲题
有源汇最大流
dinic
特殊图的分析
边权为 \(1\):
设 \(s\to t\) 的最短路长 \(l\),残余流量为 \(M\)。
令 \(v_i\) 为距离 \(s\) 最短路为 的点的数量,那么有 \(v_i\times v_{i+1}\ge M\),则有 \(\max(v_i,v_{i+1})\ge \sqrt M\)。
\(\sum v_i\le n\),\(\lfloor\dfrac{l}{2}\rfloor\sqrt M\le n\),那么有 \(l\le\dfrac{2n}{\sqrt M}\)。
记最大流为 \(f^\star\),假设现在我们获得的流量为 \(f\)。
- \(f\ge f^\star-n^{\frac{2}{3}}\),至多再有 \(n^{\frac{2}{3}}\) 次增广。
- \(n^{\frac{2}{3}}\le f^\star-f\le M\),增广路长度至多为 \(l\le 2n^{\frac{2}{3}}\),至多增广 \(O(n^{\frac{2}{3}})\) 次。
复杂度 \(O(n^{\frac{2}{3}}m)\),再考虑增广次数为 \(O(\sqrt m)\),总复杂度 \(O(\min(n^{\frac{2}{3}},\sqrt m)\cdot m)\)。
以此可以得到二分图 dinic 复杂度 \(O(m\sqrt n)\)。
最小割
最大流最小割定理:最大流 = 最小割。
费用流
bfs 换最短路。
最大流/最小割模型
最大权闭合子图
切糕模型
平面图最小割
一个平面图(把点放在平面上,任意两条边除了端点没有交点)。
考虑源点和汇点分别向无限远处引出一条射线,这两条射线互不相交且和所有边除了端点没有交点,那么这两条射线与这些边把平面分成了若干个部分。
我们构建一个新图,新图里的每个点代表一个部分,如果两个部分有共用的边,那么给它们对应的点连边,边权与共用边边权一致。
那么平面图最小割等于其中一个面积无限大的部分对应的点到另一个面积无限大的部分对应的点的最短路。
二分图最小点覆盖、最大独立集
最小点覆盖 + 最大独立集 = 总点数。
最小不交链覆盖
最小可交链覆盖
最长反链
二分图匹配,某些点必须在匹配内
Hall 定理
二分图 \(G\) 能完美匹配当且仅当:
对于所有左部点集 \(S\),\(T\) 为 \(S\) 出边的右部点集并,\(|S|\le|T|\)。
上下界网络流
无源汇上下界可行流
要求每条边的流量分别在自身容量上下界内,且每个点流入流出平衡。
那么我们可以建立超级源点 \(S\) 和超级汇点 \(T\)。
若有边 \(u\xrightarrow{[l,r],cost}v\) 则变为:
- \(u\xrightarrow{l,0}t\)
- \(s\xrightarrow{l,0}v\)
- \(u\xrightarrow{r-l,cost}v\)。
有源汇上下界最大流
\(t\xrightarrow{\inf,0}s\),变为无源汇,跑无源汇上下界可行流,删去这条边,跑 \(s\to t\) 有源汇最大流。
有源汇上下界最小流
\(t\xrightarrow{\inf,0}s\),变为无源汇,跑无源汇上下界可行流,删去这条边,跑 \(t\to s\) 有源汇最大流。
CF704D Captain America
有 \(n\) 个平面上的点,需要黑白染色。
需要满足 \(m\) 个形如在某条与坐标轴平行的直线上白点和黑点数之差小于某个数的限制。
给一个点染黑的代价为 \(b\),染白的代价为 \(w\)。
求最小代价。
\(n,m\le 10^5\)。
CF843E Maximum Flow
P4003 无限之环
P4043 [AHOI2014/JSOI2014] 支线剧情
CF1416F Showing Off
QOJ1454 Um nik's Algorithm
CF1284G Seollal
12.10 图论专题讲题
P7450 [THUSCH2017] 巧克力
QOJ1197 Draw in Straight Lines
有 \(n\times m\) 的网格,初始全为白色。有代价常数 \(a,b,c\)。
可以任意顺序执行以下操作:
- 选择同一行/列连续 \(k\) 个格子染成黑/白色,代价 \(ka+b\)。
- 选择一个格子,染成黑/白色,代价 \(c\)。
每个格子至多被染两次色,染成白色的格子不能在被染色(初始白色除外)。
求到达目标状态的最小代价。
\(1\le n,m\le 40\),\(0\le a,b,c\le 40\)。
建图,\(hb,cb,hw,cw\) 分别表示 \(i,j\) 被横着/竖着染成黑的/白的。
贡献为 \(\displaystyle a\sum hb_{i,j}+b\sum hb_{i,j}\cdot\overline{hb_{i,j+1}}\),列的同理。
对于黑点,贡献为 \(c\cdot \overline{hb_{i,j}}\cdot\overline{cb_{i,j}}+\infty(hw_{i,j}+cw_{i,j})\)。
对于白点,贡献为 \(c\cdot \overline{hw_{i,j}}\cdot\overline{cw_{i,j}}+\infty(hb_{i,j}+cb_{i,j})\)。
将 \(hw,cw\) 取反,剩下形如 \(\sum cx\bar y\) 和 \(\sum cx\) 的式子,最小割模型。
时间复杂度 \(O(n^3m^3)\)。
GYM 103860H
给一个二分图,求有多少点对使得删除之后最大匹配不变。
删去某一边的两个点是简单的。
12.11 模拟赛
T1
据说 3300?这也太难了。
先缩连续段,然后发现一个长 \(len\) 的颜色段 \(len-1\) 次就消完了,匹配一下就行。
然后样例 \(aabaa\) 寄了,原因:消除了中间的 \(aba\),剩下两边的 \(aa\) 实际上不能不管。
然后把剩下的递归处理,只能过 kristoff4 /lh。
\(\rule{20cm}{0.05em}\)
把 \(s_i=s_{i+1}\) 的 \(s_i\) 假如字符串 \(t\)。
一次操作肯定会改变 \(t\)。
考虑一次操作 \(t_i\) 对 \(t\) 的影响:
- \(t_{i-1}=t_i\),删去 \(t_i\)。
- \(t_{i-1}\ne t_i\),删去 \(t_{i-1},t_i\)。
T2
建图,\(a_i\to b_i\),每个点出度 \(\le 1\)。
对于一个连通块,有环显然动不了,没有环的是内向树,下面只考虑内向树。
内向树根是空白节点,只能把某个点换到根。
定义 \(dep_{rt}=0\),把 \(x\) 换到根需要 \(dep_x\) 的代价。
从 \(m\sim 1\) 贪心,若第 \(i\) 条边交换更优,并且它所在的树的空白节点处于它的祖先,则换空白点 \(i\)。
12.12 计数专题讲题
组合计数
常见组合恒等式
P8367 [LNOI2022] 盒
称 \(sa,sb\) 为 \(a,b\) 的前缀和。
答案是 \(\displaystyle\sum_{i=1}^{n-1}w_i|sa_i-sb_i|\)。
拆贡献,考虑 \((i,i+1)\) 操作的贡献:\(\displaystyle\sum_{i=1}^{n-1}w_i\sum_{j=0}^S|sa_i-j|f(i,j)f(n-i,S-j)\)。
其中 \(\displaystyle f(i,j)={i+j-1\choose i-1}\)(插板)
发现 \(\displaystyle j\times f(i,j)=j{i+j-1\choose i-1}=i{i+j-1\choose i}\)
考虑 \(\displaystyle\sum_{j=0}^k f(i,j)f(n-i,S-j)\) 组合意义:\(n\) 个盒子放 \(m\) 个相同的球,前 \(i\) 个盒子球数不超过 \(k\)。
枚举第 \(k+1\) 个球的位置:\(\displaystyle\sum_{j=i+1}^n f(j-1,k)f(n-j-1,s-k-1)\),可以在 \(i\) 变化时维护。
CF1097G Vladislav and a Great Legend
给一棵 \(n\) 个点的树,记 \(f(S)\) 为点集 \(S\) 的虚树的边数,求:
\[\sum_S f(S)^k \]\(n\le 10^5\),\(k\le 200\)。
二项式定理:
转化方幂:
最后一部分组合意义时虚树选 \(i\) 条边,将其计入 dp 状态。
树形背包,时间复杂度 \(O(nk)\)。
图计数
无向连通图计数
求 \(m\) 个点的无向连通图个数。
枚举 \(1\) 所在连通块大小,递归子问题。
欧拉图计数
条件:所有点度数为偶数且连通。
令 \(g_i=2^{i-1\choose 2}\):
可以多项式优化。
有向无环图计数
钦定入度为 \(0\) 的点的数量:
这里容斥的含义比起一般情况稍有不同,我们希望分配容斥系数使得 \(\displaystyle\sum_{T\subseteq S}f(T)=1\)。
强连通图计数
非强连通图缩点后是至少有两个点的有向无环图。
\(g_{i,j}\) 表示 \(i\) 个点组成了 \(j\) 个强连通图的方案数。
整体转移 \(\displaystyle h_i=\sum_{j=1}^i(-1)^{j+1}g_{i,j}\):
可以多项式优化。
Prufer 序列
Prufer 序列和有标号无根树形成双射。
树对应到序列:取出编号最小的叶子结点删去,将其亲加到序列末端。
序列对应到树:度数等于出现的次数加一,每次选择编号最小的当前状态下的叶子,其父亲唯一确定。
- \(n\) 个点有标号无根树数量:\(n^{n-2}\)。
- \(n\) 个点确定度数有标号无根树数量:\(\displaystyle\frac{(n-2)!}{\prod\limits_{i=1}^n (deg_i-1)!}\)。
- \(n\) 个点形成 \(k\) 个连通块,添加 \(k\) 条边使得原图连通的方案数:
CF917D Stranger Trees
传奇计数王 CF917D 竟然还可以 Prufer……
P6596 How Many of Them
缩点之后形成一棵树,可以计数划分成若干块的方案,在用 Prufer 结论 3,对 \(siz_i\) 上个 dp 即可。
容斥
特殊容斥系数
[ABC236Ex] Distinct Multiples
给定 \(N,M\) 和序列 \(D\),求满足以下条件的序列 \(A\) 的个数:
- \(1\leq A_i\leq M(1\leq i\leq N)\)
- \(A_i\neq A_j(1\leq i<j\leq N)\)
- \(D_i|A_i\)
\(2\le N\le 16\),\(1\le M\le 10^{18}\),\(1\le D_i\le M\)。
考虑容斥,将原数组划分成 \(k\) 组,钦定组内元素相等。
问题在容斥系数不是 \((-1)^k\),本质上应该枚举 \(n\choose 2\) 对不等关系中不被满足的,才是经典的容斥系数。
本质上只需要求出 \(\displaystyle\sum_{T\subseteq E}(-1)^{|T|} [T\text{ is connected}]\)。
用图计数相关技巧,考虑减去不连通图的贡献:
点边容斥
信友队341 树的重心
给一棵 \(n\) 个点的树,可以断掉其中若干条边.
定义一种断边方案的权值为所有连通块重心的编号和(若有两个重心则都计入权值)。
求所有不同的断边方案的权值和。
\(n\le 3000\)。
考虑重心的判定方式:重心是最深的满足 \(siz_x\ge \left\lceil\dfrac{n}{2}\right\rceil\) 的点。
注意到满足 \(siz_x\ge \left\lceil\dfrac{n}{2}\right\rceil\) 的点形成一条祖先后代链,考虑类似点边容斥的做法:
将点 \(x\) 的权值设为 \(x-fa_x\),\(siz_x\ge \left\lceil\dfrac{n}{2}\right\rceil\) 就将其权值计入。
关键问题在于断边操作导致 \(n\) 不是固定的。
条件可以改写为父亲方向的点数不超过当前点子树大小,可以分两阶段 dp。
一些技巧
树的拓扑序计数
树(外向)拓扑序数量:
树上排列计数
给一棵 \(n\) 个点的树,对于一个排列 \(a\),记 \(k\) 表示有多少个点是它到根的 \(a\) 最小值。
定义 \(a\) 的权值为 \(m^k\),求 \(n!\) 种排列的权值和。
\(n\le 5000\)。
钦定若干个点满足条件,这些点的大小关系限制构成一棵
树,对于不满足条件的点 \(x\),向上找到第一个满足条件的点 \(y\) 使得 \(a_x>a_y\)。
这并不等价于树的拓扑序计数,因为边的方向并不统一,不过容斥一下就好了。
状态记录当前容斥后限制构成树的大小,每钦定一个点不满足条件就做一步容斥。
延后钦定
CF1608F MEX counting
给长为 \(n\) 的序列 \(b\) 和常数 \(m\)。
求有多少序列 \(a\) 满足 \(a_i\in[0,n]\),\(\forall i\in[1,n],|\operatorname{mex}(a_1,a_2,\dots,a_i)-b_i|\le m\)。
对 \(998244353\) 取模。
\(1\le n\le 2000\),\(1\le m\le 50\)。
记录当前 mex,和有多少种大于 mex 的数,只在当前 mex 变化的时候确定之前的数具体是什么。
相比记录之前有多少个大于 mex 的数的好处:这样记录需要在转移时去做钦定,枚举的东西多了一维,而边加入边钦定就不用了。
具体地,\(dp_{i,j,k}\) 表示考虑前 \(i\) 个数,当前 mex 为 \(k\),有 \(j\) 种大于 \(k\) 的数的方案数。
延后钦定指的就是在之后 mex 变化时再钦定大于 mex 的数具体的值。
转移:
-
\(a_i\ne k\),mex 不变化。
-
\(a_i<k\)
\(dp_{i,j,k}\gets k\times dp_{i-1,j,k}\)
-
\(a_i>k\),之前 \(a_i\) 出现过。
\(dp_{i,j,k}\gets j\times dp_{i-1,j,k}\)
-
\(a_i>k\),之前 \(a_i\) 没出现过。
\(dp_{i,j,k}\gets dp_{i-1,j-1,k}\)
-
-
\(a_i=k\),mex 变化。
枚举变化后的 mex \(t>k\)。
需要钦定 \(k+1\sim t-1\) 的数,会使用 \(t-k-1\) 次钦定,方案是排列数 \(\mathrm A_j^{j-k-1}\)。
\(dp_{i,j,t}\gets \mathrm A_{j+(t-k-1)}^{t-k-1}dp_{i-1,j+(t-k-1),k}\)
需要满足 \(b_i-m\le k\le b_i+m\),所以 \(k\) 的状态是 \(O(m)\) 的,转移也是 \(O(m)\) 的。
最后答案是 \(\displaystyle\sum_{i=1}^n\sum_{j\le i}\mathrm A_{n-j}^{i}dp_{n,i,j}\)。
复杂度 \(O(n^2m^2)\),需要优化。
观察式子:\(dp_{i,j,k}\gets \dfrac{\big(j+(k-t-1)\big)!}{j!}dp_{i-1,j+(k-t-1),t}\),前缀和优化即可。
时间复杂度 \(O(n^2k)\)。
连续段 dp
其实是在做“插入”形式的 dp。核心是状态设计:
形成了 \(i\) 个连续段意味着,段内不会再插入数,段间还需要插入数。
TopCoder 11213 AppleTrees
有坐标为 \(1\sim d\) 的 \(d\) 个点,有 \(n\) 棵树要种在这些点上。
要求第 \(i\) 棵树与两旁相邻的树的距离至少为 \(r_i\)。
求方案数。
\(1\le d\le 10^5\),\(1\le n,r_i\le 40\)。
\(d\) 范围较大,考虑求出最紧的状态后插板求方案。
按 \(r_i\) 从小到大连续段 dp,\(dp_{i,j,k}\) 表示前 \(i\) 棵树形成 \(j\) 段连续段,总长度 \(k\) 的方案数。
时间复杂度 \(O(n^4)\)。
CF1515E Phoenix and Computers
板题。
CF1781F Bracket Insertion
拆贡献
CF1842G Tenzing and Random Operations
考虑用分配律拆开连乘。这样只需要对于 \(i\) 选出 \(a_i\) 或 \(v\) 其中之一计算贡献。
\(dp_{i,j}\) 表示前 \(i\) 个数钦定了 \(j\) 次操作的贡献。
时间复杂度 \(O(n^2)\)。
对应、双射
CF1264D2 Beautiful Bracket Sequence (hard version)
范德蒙德卷积优化……
状态优化
[AGC017F] Zigzag
格路计数
P3266 [JLOI2015] 骗我呢
CF1924D Balanced Subsequences
更多技巧

12.12 杂题讲题
2-SAT 计数
给定 \(n\le 60\) 个变量的 2-SAT,求可行方案数。
先建图,缩点为 DAG。
暴搜,确定 \(x=1\),那么 \(x\) 的后继都是 \(1\),\(\neg x\) 的前驱都是 \(0\)。
度数 \(\le 2\),随机选择一个点期望折半。度数 \(\ge 3\) 则复杂度约为 \(O(1.38^n)\)。
PKUSC2021 D2T3
有 \(n\) 个人,每个人会在 \([0,m]\) 中均匀随机一个实数时刻到达。
有两个地方可以处理,每处理一个人需要 \(k\) 个时刻。
求所有人在到达之后都不需要等待的概率,对指定质数 \(p\) 取模。
\(1\le n\le 50\),\(1\le k\le m\le 150\)。
考虑概率密度函数,令 \(f_{i,j,k}\) 标识决策了前 \(i\) 个人,\(x_i==j,x_{i-1}=k\) 的概率密度。
虽然决策是实数,但是各种区间的端点都是整数,考虑拆分整数和小数部分。
\(x_i=y_i+z_i,y_i\in \mathbb{Z},z\in[0,1)\)。
?????
2021 北京队集训 D7A
给定一个 \(n\le 8000\) 的完全图,每个边为黑色/白色,求同色三角形个数。
算有两黑一白的三角形是简单的(一个点有一黑一白的出边则必有 \(1\) 个)。
两白一黑同理。
[ARC118E] Avoid Permutations
PKUWC2020 D1T1
给定 \(1\sim n\) 的排列 \(p\),设序列 \(a\) 为所有字典序不大于 \(p\) 的排列连接起来的序列。
求 \(a\) 本质不同子序列数目,模 \(998244353\)。
\(1\le n\le 50\)。
P4547 [THUWC2017] 随机二分图
生成函数与线性代数
形式幂级数
- \(\mathbb F[x]:A(x)=\sum\limits_{n\ge 0}^{n1}a_n x^n\)
例题 1:定向
给一个无向图,求其无环定向方案数 \(\bmod p\)。
\(1\le p\le 3\)。
\(p=1/2\) 是 trival 的。多项式 \(f(x)\equiv f(x\bmod p)\pmod p\)
记无环无向定向方案数为 \(f(G)\)。
随便选 \(e=(u,v)\in G\),删掉 \(e\) 得到 \(G\setminus \{e\}\) 的无环定向,对于每种方案讨论,得:
\(f(G)=f(G\setminus \{e\})-f(G/e)\)。
结论:无向无环定向相当于 \(-1\) 染色。
判定二分图然后 \(-1\) 染色即可。
P7468 [NOI Online 2021 提高组] 愤怒的小 N
给定 \(k+1\) 次多项式 \(f(x)\),考虑 \(\le n\) 的所有 \(\operatorname{popcount}\) 为奇数的数,将此集合记为 \(S\)。
求 $$\displaystyle \sum_{i\in S}f(i)$$,对 \(10^9+7\) 取模。
\(n\le 2^{5\times 10^5}\),\(k\le 500\),\(n\) 以二进制给出。
这都什么玩意啊?摆了摆了……
12.14 字符串专题讲题
[ARC060F] 最良表現
给一个长为 \(n\) 的字符串 \(s\),求至少能将其划分为几个周期串。
\(n\le 5\times 10^5\)。
\(s\) 不是周期串答案就是 \(1\),\(s\) 是周期串:
- \(s\) 所有字符都一样,答案为 \(n\)。
- \(s\) 所有字符不都一样,答案为 \(2\)(划分为 \(s[1\dots n-1],s[n,n]\))。
P3426 [POI2005] SZA-Template
设 \(f_i\) 表示前缀 \(s[1\dots i]\) 的答案。
\(f_i\) 只能是 \(i\) 或 \(f_{nxt_i}\)。
CF1610G AmShZ Wins a Bet
CF1110H Modest Substrings
QOJ9372 Prefix of Suffixes
记 \(z_i=\operatorname{lcp}(suf_i,s)\)。
\(\displaystyle f(s)=\sum_{i=1}\sum_{j=i}^{i+z_i-1}A_j B_i\)。
动态在 \(s\) 末尾添加字符,求 \(f(s)\)。
\(|S|,|\Sigma|\le 10^6\)
显然 \(z_i\) 单调,考虑 \(f(s)\) 变化量。
在 \(j\) 的视角看,\(j-x+1\) 的个数只会增加 \(1\)。
大力 DS 就 \(O(n\log n)\),可以智慧 \(O(n)\)。
QOJ7748 Karshilov's Matching Problem II
给两个字符串 \(s,t\),定义 \(f(s,t)\) 为 \(s\) 在 \(t\) 中的出现次数。
\(q\) 次询问 \(l,r\):\(\displaystyle\sum_{i}w_i\times f(s[1\dots i],t[l\dots r])\)。
\(|S|,|T|,q\le 5\times 10^5\)。
\(f(s[1\dots i],t[l\dots r])\ge f(s[1\dots i-1],t[l\dots r])\),对 \(w\) 做前缀和 \(sw\)。
现在相当于求 \(\displaystyle\sum_{i=l}^r sw_{\min(r-i+1,z_i)}\)。
OpenJudge 2021 C
转化为逆序对个数一样,满足 border 传递性,可以 KMP。
QOJ9318 AC Automation Chicken
已知 trie 和 fail 树构成的 \(2n-2\) 条边,还原 trie。
\(n\le 5\times 10^5\)
尝试找到根,根会有重边。
重边:
- 与根相邻。
- 连续的相同字符。
有点重边度数 \(\ge 3\) 则必为根。
重边组成的链上有出边,可以判断根的 \(2\) 种可能位置。
知道根之后就很简单了。
[ARC141F] Well-defined Abbreviation
Border 等差数列
一个字符串的 border 构成 \(O(\log n)\) 个等差数列。
例题:P5287。
P1393 Mivik 的标题
二维 dp 显然无法优化(吗?),考虑设计一维状态 dp。
CF932G Palindrome Partition
将 \(s\) 后半段翻转交替插入到前半段,变成偶数长度回文划分方案数。
PAM?寄。
可以用枚举回文后缀的方法 dp。
CF906E Reverses
将 \(t\) 交替插入 \(s\),变为最小回文划分。
之后就一样了。
BZOJ5384 有趣的字符串题
区间本质不同回文子串。
\(n,q\le 2\times 10^5\)。
QOJ5037 回文
给字符串 \(s\),支持以下操作:
- 单点修改
- 询问区间回文后缀数量。
强制在线
\(1\le |s|,q\le 2\times 10^5\)。
考虑 DS 维护回文后缀等差数列。




浙公网安备 33010602011771号