2026.11 肢体降临

qoj20737 Interval MST
如何求单次答案?设 \(p_i=\max_{j=l}^{i-1}x_j,s_i=\min_{j=i+1}^{r}x_j,c_i=\min(0,x_i-p_i,s_i-x_i)\),答案是 \(x_r-x_l+\sum_{i=l+1}^{r-1}c_i\)。
为啥?我也不知道。
线段树,对每个节点预处理出区间内每个位置的 \(p,s,c\)。查询时,把查询区间拆成 \(O(\log n)\) 个小区间。
对一个小区间 \([l,r]\),设他前面的区间最大值为 \(P\),后面的区间最小值为 \(S\),贡献是 \(\sum_{i=l}^{r}\min(c_i,x_i-P,S-x_i)\)。
显然 \(P>p_i\) 的 \(i\) 是一段前缀,\(S<s_i\) 的 \(i\) 是一段后缀,可以二分求出这两段然后大力分讨。
若 \(i\) 只在前缀里,贡献是 \(\min(x_i-P,c_i)=x_i+\min(-P,c_i-x_i)\),随便做。只在后缀是类似的。
若 \(i\) 同时在前缀和后缀里,贡献是 \(\min(0,x_i-P,S-x_i)\),把值域分三段计数就行。
若 \(i\) 都不在,贡献就是 \(c_i\),求和就行。
洛谷P17825 [COCI 2026/2027 #1] 三堆箱子 / Tri
我咋分治都不会???
设 f(a,b,l,r) 表示 \(a\) 堆顶上有连续、不一定有序的 \([l,r]\) 箱子,要把这些全都有序堆到 \(b\) 堆上。
当 \(l=r\) 时,直接把 \(a\) 顶上的箱子搬到 \(b\) 顶上就行。
否则,设 \(mid=\lfloor\frac{l+r}{2}\rfloor\),直接分治!
若 \(a=b\),先把 \([l,mid]\) 和 \((mid,r]\) 分到另外两个堆,然后 f(c,b,l,mid),f(d,b,mid+1,r)。
若 \(a\ne b\),先把 \([l,mid]\) 分到 \(b\),\((mid,r]\) 分到另外一个堆,然后 f(b,b,l,mid),f(c,b,mid+1,r)。
操作次数是 \(O(n\log n)\) 的,随便过。
洛谷P17571 「FAOI-R(-2)」数列计数 2024
有一个朴素的 dp 是,设 \(f(n)\) 表示结尾为 \(n\) 的序列数,有 \(f(n)=\sum_{i=\lceil\frac{n}{2}\rceil}^{n-1}f(i)\)。
你发现 \(\lceil\frac{n}{2}\rceil\) 每当 \(n\) 加二时它才加一,把相邻两个数的转移放在一起,有:
注意这两个式子需要满足 \(k>0\),因为 \(f(1)=f(2)=1\)。
你发现 \(f(n)\) 其实是 \(2^{n-2}f(2)\),再减去一堆 \(2^{n-(2k+1)}f(k)\),也就是说:
设 \(F_{n}(x)=\sum_{i=1}^{n}f(i)x^i\),则 \(f(n)=2^{n-2}(1-2F_{\lfloor\frac{n-1}{2}\rfloor}(\frac{1}{4}))\)。
你发现 \(f(n)-2f(n-1)\) 这个东西比较好看,也就是:
设 \(G_{n,m}=F_{n}(\frac{1}{4^{2^{m}}})\),你发现一次询问只需要求很少的 \(G\),而这些 \(G\) 都能递推,就做完了。
边界是 \(G_{1,m}=\frac{1}{4^{2^m}},G_{2,m}=\frac{1}{4^{2^m}}+\frac{1}{4^{2^{m+1}}}\)。
qoj18004 Call You With Your Name
对于一个 \(p_i\),若存在 \(j>i,p_j<p_i\),那 \(p_i\) 其实没啥用,所以我们只关心后缀最小值。
把所有 \(l\) 从小到大排序,显然 \(p_n=n\) 最优。感受一下,从前往后扫,若改名后字典序变大就改,否则不改。
先让 \(s\) 改到 \(l_1\)。比较字典序可以考虑二分哈希,设要求出 \(s\) 改了 \(L_1,L_2,\ldots,L_m\) 后循环串前 \(k\) 位的哈希。
求出最后的 \(p\) 使得 \(L_p\le k\),分成求改到 \(L_p\) 时循环 \(\lfloor\frac{k}{L_p}\rfloor\) 次的哈希和前 \(k\bmod L_p\) 位的哈希。
对每个 \(i\) 求出改到 \(L_i\) 时的哈希,第一部分就是个快速幂,第二部分可以递归下去做,显然只会递归 \(O(\log)\) 次。
洛谷P17816 [ICPC 2019 Nanchang R] XOR Sum
我咋这都不会?
设 \(g(t,y)=\sum_{i=1}^{t}\sum_{j=1}^{y}f(j,i)\),答案就是 \(g(t,y)-g(t,x-1)\)。
显然 \(f(j,i)=\left\{\begin{matrix}j^i&j^i\equiv 0\pmod4\\1&j^i\equiv 1\pmod 4\\j^i+1&j^i\equiv 2\pmod 4\\0&j^i\equiv 3\pmod 4\end{matrix}\right.\),其中 \(1\) 的贡献是好算的,只需算所有 \(i\) 是偶数的 \(i^j\) 和。
\(g(t,y)=?+\sum_{i=1}^{\lfloor\frac{y}{2}\rfloor}\sum_{j=1}^{t}(2i)^j=?+\sum_{i=1}^{\lfloor\frac{y}{2}\rfloor}\frac{(2i)^{t+1}-2i}{2i-1}\)。
你发现内层循环是 \(t\) 次多项式,所以外层循环是 \(t+1\) 次多项式,直接拉插就行。
AGC051B Bowling
这也太难了。
放 \(10\) 个 \(y=x\) 相同的点可以让 \(b=1\),\(a=c=d=10\),把这个称为结构一。
放 \(10\) 个 \(x\) 相同的点可以让 \(c=1\),\(a=b=c=10\)。把这些点都换成结构一,可以让 \(b=c=10\),\(a=d=100\)。
类似的,再套一层横着的就能让 \(a=b=c=100\),\(d=1000\)。
CF1909H Parallel Swaps Sort
这个题,真厉害吧。
若 \(a_i>a_{i-1}\),则下标 \(i\) 是类型 \(A\),否则是类型 \(B\)。钦定 \(1\) 是类型 \(A\),合法当且仅当全是 \(A\)。
下面的 \(A,B\) 可能指的是数,也可能是下标,看起来会比较怪(
固定右端点 \(r\),找到最小的 \(l\) 使得 \([l,r]\) 是 \(?B?B\ldots\) 的形式,钦定每次操作都是操作 \([l,r]\)。
先让 \(r\) 从 \(1\) 到 \(n\) 操作一遍,再从 \(n-1\) 到 \(1\) 操作一遍,可以证明操作完后一定是对的??
顺着做的时候只考虑 \([1,r]\) 中的下标,倒着做的时候考虑所有下标,则有如下结论(都是归纳证明):
结论 1:一个数交换前的下标是 \(A\),交换后的下标也会是 \(A\)。
\([l,r]\) 会从 \(?B?B\ldots\) 变成 \(?A?A\ldots\),交换前只有奇数位可能是 \(A\),交换后到偶数位,而偶数位都是 \(A\)。
结论 2:不存在两个相邻的 \(B\)。
显然,\([1,l)\) 不存在相邻的 \(B\),且 \(l\) 是 \(A\)。对于 \([l,r]\),他交换后会变成 \(?A?A\ldots\),不存在相邻的 \(B\)。
结论 3:所有 \(A\) 元素单调递增。
根据结论 1,只需考虑交换前的下标是 \(B\),交换后的下标是 \(A\) 的元素。
若一个数换到 \(i\) 后是 \(A\),且 \(i+1\) 换前是 \(B\),那么换后 \(i-1,i,i+1\) 都是 \(A\),也就是 \(a_{i-1}<a_i<a_{i+1}\)。
也就是说,一个位置是 \(A\) 当且仅当他是前缀最大值。
结论 4:倒着做完 \(r\) 到 \(n-1\) 后,\([r,n]\) 只会是 \(r,r+1,\ldots,n\)。
\(r\) 所在位置是 \(A\),而换后位置 \(r\) 是 \(A\),所以位置 \(r\) 只能是 \(r\)。
把所有 \(B\) 的数拉出来,你发现他的相对位置不变,且没有插入,只会删除。
用线段树维护每个 \(B\) 的位置,\([l,r]\) 可以操作当且仅当区间内 \(B\) 的位置和等于 \(\frac{1}{4}(r+l+1)(r-l+1)\),交换是区间减一。
一个数从 \(B\) 变成 \(A\) 当且仅当他和前面所有比他大的都换了一次,预处理每个数前面比它大的个数,交换也是区间减一。
洛谷P3109 [USACO14OPEN] Code Breaking G
直接容斥,钦定不满足一些限制,容斥系数是 \((-1)^c\),\(c\) 是钦定不满足的限制个数。
考虑 dp,设 \(f_{u,S}\) 表示只考虑点 \(u\) 的子树,\(u\) 往上需要是 \(S\) 的答案。
转移就是,\(f_{v,T}\) 能转到 \(f_{u,S}\) 当且仅当 \(T\) 去掉第一个字符后是 \(S\) 的前缀。子树间合并就是求和后乘起来。
这对吗?你发现现在求的其实是 \(f_{u,S}\) 表示 \(u\) 往上需要是 \(S\) 的前缀的答案,容斥一下就行了。
你发现它只有 \(n+5m\) 个状态,直接做就是平方了,再上个 trie 就做完了。
答案就是 \(10^n-\sum_{S}f_{1,S}\)。你发现限制可能重复,还需要特判一下。
qoj11481 Permutacje
\(i\to q_{p_i}\) 比较丑,可以写成 \(p^{-1}_i\to q_i\),你发现让这个图全是自环就赢了。
考虑怎么拆环。若 \(u,v\) 在一个环上,你发现只需要交换 \(q\) 中 \(u,v\) 的位置就行了,合并环是一样的。
考虑二分。设现在让 \([1,i)\) 两两不同环,只需要找到 \([1,i)\) 中和 \(i\) 同环的点,然后拆掉。
设你要对 \([1,p]\) check,可以让 \(q\) 的 \([1,p]\) 循环移位,让 \([1,p]\) 在同一个环里,然后查询一遍就行。
洛谷P16458 [UOI 2026] mex plus
\(a_i,b_i\) 连边,相当于要给边定向,\(A\) 就是入度 \(>0\) 的集合,\(B\) 就是出度 \(>0\) 的集合。不妨令 \(\text{mex}(A)\le\text{mex}(B)\)。
若一个联通块有环,你发现所有度数 \(\ge2\) 的点都能同时加到 \(A,B\),度数为 \(1\) 的点肯定全都加到 \(B\) 更优。
考虑他对 \(a=\text{mex}(A),b=\text{mex}(B)\) 的限制,需要 \(a\le\) 编号最小的度为 \(1\) 的点,\(b\) 没限制。
若没环,可以让 \(\max\) 为根,变成一棵根向树,根会加到 \(A\),叶子会加到 \(B\),其他点同时加到 \(A,B\)。
限制是 \(b\le\max\),\(a\le\) 编号最小的叶子。
所以 \(a\) 就是度数 \(\le 1\) 的点的最小值,\(b\) 是所有无环联通块的最大值的最小值,线段树分治即可。
AGC047E Product Simulation
若 \(A=B=0\),你发现怎么操作都行,可以不管。
考虑如何造 \(1\),你发现 \([0<[0<A]+[0<B]]=1\)。
对 \(a_i\in\{0,1\}\),考虑如何造 \(a_j=a_i\oplus 1\),也就是 \(a_j=[a_i<1]\)。
对 \(a_i,a_j\in\{0,1\}\),考虑如何造 \(a_k=a_i\operatorname{and}a_j\)。其实是 \(a_k=[1<a_i+a_j]\)。
考虑对 \(A\) 拆位。从高往低,设枚举到 \(i\),更高位是 \(S\),第 \(i\) 位就是 \([A<S+2^i]\) 取反。
设 \(A=\sum f_i2^i,B=\sum g_i2^i\),那么 \(A\times B=\sum_{i,j}(f_i\operatorname{and}g_j)2^{i+j}\)。
洛谷P6700 [PA 2015 Final] Edycja
显然每种字符最多做一次二操作,每个位置最多做一次一操作。
设 \(w_{i,j}\) 表示先把所有字符 \(i\) 改为 \(j\),再把它们都改成对的的最小代价。
设 \(c_{i,j}\) 表示有多少个 \(p\) 使得 \(a_p=i,b_p=j\),那么 \(w_{i,j}=[i\ne j]c+\sum_{k}c_{i,k}-c_{i,j}\)。
设 \(p_i\) 表示要把 \(i\) 改成啥,代价就是 \(\sum w_{i,p_i}\) 再加一堆 \(c\),贪心地让 \(p_i\) 成为取到 \(w_{i,j}\) 最小值的那个。
连边 \(i\to p_i\),若一个联通块是树(根自环),可以从根往下操作,就没有多余的 \(c\)。
若一个联通块是基环树,可以先让环上的一个点 \(a\),把他改成 \(p_a\) 的某个儿子,也没有多余的 \(c\)。
若一个联通块是大小 \(>1\) 的环,你发现只能让一个点先改成环外的点,后面再改回来,有一个多余的 \(c\)。
所以代价就是 \(\sum w_{i,p_i}\) 再加上 \(c\) 乘上大小 \(>1\) 的环数。注意一个方案要么全是自环,要么有至少一个非环联通块。
你发现这个可能不是最优的,调整一下。有一个性质是存在最优方案,使得所有环都是原图上的纯环/基环树上的环。
证明就是,若存在一个不满足条件的环,那环上肯定有一条边不是原图边,那你换回那条原图边肯定不劣。
dp,设 \(f_{i,S,0/1}\) 表示目前考虑到 \(i\),环集 \(S\) 被爆破了,有没有非原图边的最小代价,转移就是直接枚举出边,第三维判合法。
因为只考虑大小 \(>1\) 的环,而这样的环最多就 \(13\) 个,所以复杂度对完了。
洛谷P10283 [USACO24OPEN] Identity Theft P
死也想不到直接贪心。。。
把 01trie 建出来,转化为有一个点集,每次可以让一个点往下走或造儿子,要求每个点最多两个儿子,且点集里都是叶子。
对于点 \(u\),可以在子树里选有一个儿子的点 \(v\),代价是 \(d_v-d_u+1\),或选一个叶子 \(v\),代价是 \(d_v-d_u+2\)。
你发现按 \(u\) 深度从大往小,每次选一个深度最小的点 \(v\) 贪心就对完了,现在只需要维护这些点 \(v\)。
这不是好做的吗,直接用两个堆维护两种 \(v\) 的深度集合,从下往上合并就做完了啊。
洛谷P10197 [USACO24FEB] Minimum Sum of Maximums P
神秘:\(\max(a,b)=\frac{a+b+|a-b|}{2}\),在序列两边都插一个 \(+\infty\),\(\sum a+b\) 就是固定的,只用最小化 \(\sum|a-b|\)。
对于一个极长区间 \([l,r]\),其中没有被固定的,设 \(L=\min(a_{l-1},a_{r+1}),R=\max(a_{l-1},a_{r+1})\),\(x,y\) 分别为区间最小/大值。
你发现区间内的绝对值和至少为 \(|L-x|-x+y+|R-y|\),而给区间内的数排序就能到下界,所以要最小化这个东西的和。
有一个性质是,所有 \([x,y]\) 要么不交要么包含。调整法,你发现 \(y\) 递减时 \(y+|R-y|\) 不增,\(x\) 递增时 \(|L-x|-x\) 不增。
若存在 \(x_i<x_j<y_i<y_j\),每次可以让 \(y_i,x_j\) 交换,直到他们不交,显然答案不增。
设 \(sz_S=\sum_{i\in S}r_i-l_i+1\),\(f_{l,r,S}\) 表示在 \([l,r]\) 里选 \(sz_S\) 个数,把 \(S\) 里的区间填满的最小代价。
可以把 \(S\) 分割成两个集合,转移是 \(f_{l,r,S}\gets\min_{T\subsetneq S,|T|>0}f_{l,l+sz_T-1,T}+f_{r-sz_{S\backslash T}+1,r,S\backslash T}\)。
若 \(r-l+1\ne sz_S\),那么不能加入新区间,转移是 \(f_{l,r,S}\gets\min(f_{l+1,r,S},f_{l,r-1,S})\)。
否则,可以用一个区间盖住这个 \([l,r]\),转移就是 \(f_{l,r,S}\gets\min_{i\in S}|L_i-l|+r-l+|R_i-r|+f_{l+1,r-1,S\backslash\{i\}}\)。
AGC079B Range Record
设 \(a_i\) 表示 \([i,n]\) 中的前缀最大值个数,只需求出 \(a\) 就能简单还原 \(p\)。显然有 \(a_n=1,a_i\le a_{i+1}+1,a_i\le n-i+1\)。
设 \(x\) 为 \([l,r]\) 的最大值位置,那么 \([l,r]\) 的前缀最大值有 \(a_l-a_x+1\) 个。操作 \((l,r,c)\) 的限制就是 \(a_l-\min_{i=l}^{r}a_i+1=c\)。
进行一个神秘的东西。设 \(b_i\) 为 \(a_i\) 的下界,考虑维护这个 \(b\),最后令 \(a=b\)。不断进行以下操作:
- \(b_{i+1}=\max(b_{i+1},b_i-1)\)。
- \(b_l=\max(b_l,\min_{j=l}^{r}b_j+c-1)\)。
- \(\forall i\in [l,r],b_i=\max(b_i,b_l-c+1)\)。
不合法当且仅当 \(\exists i,b_i>n-i+1\)。
CF1305G Kuroni and Antihype
这也太难了。
先建一个虚点 \(a_{n+1}=0\),然后最开始邀请 \(n+1\),就把第一个操作去掉了。
现在变成给你一张图,问以 \(n+1\) 为根的叶向生成树的最大权值,权值为 \(\sum a_i|son_i|\)。
本质上是 \(\sum a_ideg_i-\sum a_i\),后面是定值,前面是 \((i,j)\) 边权为 \(a_i+a_j\) 的最大生成树。
显然 Boruvka。对于一轮内,需要每个数 \(i\) 求出 \(i\) 子集中最大值、次大值及他们的联通块。做个子集 dp 就行。
CF1630F Making It Bipartite
这也太难了。
若 \(a_u\mid a_v\) 就连边 \(v\to u\),要求是最后的图中,每个点的入度与出度至少有一个为 \(0\)。
拆点,用 \(u_0,u_1\) 表示 \(u\) 没有入度/出度,对每对矛盾的点连边。显然有 \(u_0\to u_1\)。
对于原图中的边 \(v\to u\),显然有 \(v_0\to u_0,v_0\to u_1,v_1\to u_1\)。答案就是 \(n\) 减去最大独立集。
这都能做?你发现这张图是一个类似偏序集的东西,套一下 Dilworth 定理就变成求最小链覆盖。
把一个点 \(u\) 拆成 \(u_l,u_r\),对新图的边 \(u\to v\) 连边 \(u_l\to v_r\),最小链覆盖就是 \(2n\) 减去新新图的最大匹配。
AGC024D Isomorphism Freak
设直径长为 \(l\),可以让每条直径都变成对称的,所以第一问就是 \(\lceil\frac{l}{2}\rceil\)。
若 \(l\) 是偶数,设 \(u,v\) 为直径的两个中心。从 \(u,v\) 开始往两边 dfs,变成一棵以 \((u,v)\) 为根(?的树。
设 \(d_i\) 表示深度为 \(i\) 的点中,儿子个数的最大值。你发现你需要让所有深度为 \(i\) 的点,给儿子数加到 \(d_i\)。
所以答案就是 \(2\prod d_i\)。\(l\) 为奇数是类似的,设 \(u\) 为中心,以 \(u\) 为根、以所有 \((u,v)\) 为根都做一遍。
洛谷P14638 [NOIP2025] 序列询问
先做前缀和,设为 \(b_i\)。对一个区间 \([l,r]\),把他看成坐标系上的一个点 \((l,r)\),权值为区间和。

点 \(A\) 为 \((i,i)\),两条直线分别为 \(x+L-1,x+R-1\),你发现需要查询 \(A\) 左上角与两直线中间的交的最大权值。
显然不能直接做。拆一下,变成一个横着的平行四边形和一个等腰直角三角形。
对于平行四边形,你发现 \(x\) 的范围是 \([y-R+1,y-L+1]\),\(y\) 的范围是 \([i,i+L-1]\)。
对每个 \(y\) 求出 \(\max_{x=y-R+1}^{y-L+1}b_y-b_{x-1}\),然后做一遍单调队列就行了。

对于三角形,他直边长为 \(D=R-L+1\)。分成边长为 \(d=\lceil\frac{D}{2}\rceil\) 的正方形,和两个直边长 \(D-d+1\) 的平行四边形。
对横着的平行四边形,\(x\) 的范围是 \([y-R+1,y-L-d+2]\),\(y\) 的范围是 \([i+L-1,i+L+d-2]\),和上面一样的。
对竖着的平行四边形,\(y\) 的范围是 \([x+L+d-1,x+R-1]\),\(x\) 的范围是 \([i-d+1,i]\),和上面的差不多。
对正方形,\(x\) 的范围是 \([i-d+1,i]\),\(y\) 的范围是 \([i+L-1,i+L+d-2]\)。\(x,y\) 独立,分别求最大最小就行。
洛谷P6845 [CEOI 2019] Dynamic Diameter
有点搞笑,我还以为是 ddp 结果是直接做。
设 \(d_i\) 表示 \(i\) 到根路径的边权和,那么有 \(\operatorname{dis}(u,v)=d_u+d_v-2d_{\operatorname{lca}(u,v)}\)。
考虑欧拉序 lca,对两个点 \(u,v\),设 \(t_1,t_2\) 为他们某个出现位置,则 \([t_1,t_2]\) 中一定有一个 \(\operatorname{lca}(u,v)\)。
也就是说,设 \(p_i\) 表示欧拉序第 \(i\) 个点,\(a_i=d_{p_i}\),那么 \(\operatorname{dis}(p_l,p_r)=a_l+a_r-2\min_{i=l}^{r}a_i\)。
用线段树维护 \(a_i\),修改就是区间加。pushup 就是枚举最小值在哪边,如果枚举错了那只会算小。
洛谷P7880 [Ynoi2006] rldcot
什么鬼啊,难点在于想到 dsu on tree??
看上去很难直接做,先枚举一下 \(\operatorname{lca}\),设为 \(w\)。
把 \(w\) 子树里的点拉出来,按编号排序,设为 \(a_1,\ldots,a_m\)。若 \(i<j\) 且 \(a_i\) 和 \(a_j\) 不在同一子树,则称 \((a_i,a_j)\) 是合法对。
对两个合法对 \((a,b),(c,d),a<c<d<b\),你发现 \((a,b)\) 没啥用。考虑用 dsu on tree 减小合法对数量。
维护点集 \(S\),初始为重儿子子树。每次扫到 \(u\),就把 \(u\) 与它 \(S\) 中的前驱后继都组一个合法对。做完后只有 \(O(n\log n)\) 个对。
对所有合法对 \((u,v)\),按 \(\operatorname{dep}(\operatorname{lca}(u,v))\) 分类,同一类里的去掉没用的合法对,直接扫描线就做完了。
洛谷P14032 【MX-X20-T6】「FAOI-R7」超级电话
好难啊。
查询相当于给定 \(x,y\),问 \(\sum_{i=0}^{y}a_{i\oplus x}\)。若 \(B=20\),你发现直接上 trie 就做完了。
若 \(B\le 7\),这个好难。注意到直接 trie 会剩下超级多的 \(A\),考虑压位 trie。这是怎么想到的??
从低到高分成 \(l_1,l_2,\ldots,l_B\),表示第 \(i\) 块有 \(i\) 层。设 \(L_i=\sum_{j=1}^{i}l_j-1\),那么第 \(i\) 块就是 \([L_i,L_{i+1})\) 层。
设 \(p=n-L_{i+1},q=L_{i+1}-L_i\)。预处理 \(f_{i,x,y,z}\) 表示所有 \(t\) 满足 \([L_{i+1},n)\) 位为 \(x\),\([L_i,L_{i+1})\) 位异或 \(z\le y\) 的 \(a_t\) 和。
枚举所有状态需要 \(2^p4^q\) 次操作,太菜了。你发现有如下优化:
- 对 \(y=0\) 的状态,你发现可以从第 \(i-1\) 块的状态继承过来,不用操作。
- 设 \(c\) 表示 \(y\) 低位有几个连续的 \(1\),你发现 \(f_{i,x,y,z}\) 与 \(z\) 的最低 \(c\) 位无关。
现在的次数是 \(f(l_i)=2^p\sum_{i=1}^{2^q-1}\frac{2^q}{\text{lowbit}(i+1)}=\frac{2^p}{3}(1+2\cdot 4^q-3\cdot 2^q)\),写个 dp 求最优的 \(l\) 发现和限制一样啊!
- \(B=5\) 时有 \(l=\{1,2,3,5,9\}\)。
- \(B=6\) 时有 \(l=\{1,1,2,3,5,8\}\)。
- \(B\ge 7\) 时有 \(l=\{1,1,1,2,3,4,8\}\)。
洛谷P9469 [EGOI 2023] Sopsug / 垃圾处理
你发现必要边没啥影响,判掉不是根向森林的情况后当成 \(M=0\) 来做。
若根固定咋做?维护点集 \(S\) 表示不在树里的点,从根开始 bfs,每到一个点,就枚举 \(S\) 里的所有点,把能走到的加进队列。
你发现每次枚举时走不到的点总数是 \(O(K)\) 的,走得到的点总数是 \(O(N)\) 的,单次可以做到 \(O(N+M+K)\)。
对于一次不合法的判定,你发现那一次走到的所有点都不会是合法根,可以直接删掉,把所有点删完后取最后删的点判定。
然后就能做到线性了。不过这题数据超级菜,直接暴力枚举根都能过。
qoj9838 Shuttle Bus
定义一条边的权值为下边那个点的子树大小,一个方案的答案就是没被覆盖的边的权值和,转化成最大化被覆盖的权值和。
固定根的时候,考虑贪心,每次选一个选了后增量最大的叶子,可以证明这样一定是对的。证明:
设 \(d_u\) 表示在 \(u\) 子树做贪心,每次答案增量的序列。转移就是给 \(d_v\) 的最大值加上 \(w(u,v)\),然后归并。
由于边权是正整数,所以每次改动后 \(d\) 都是不增的,就证完了。
它其实是做类似长剖的东西,然后选前 \(k\) 长的链。设链长可重集为 \(S\),用对顶堆维护这个 \(S\)。
换根。设从 \(u\) 换到 \(v\),\(v\) 子树大小为 \(s\),总人数为 \(W\),断掉 \((u,v)\) 后 \(u,v\) 两边的最长链是 \(\alpha,\beta\)。
你发现换根时只有 \((u,v)\) 的边权从 \(s\) 变成 \(W-s\),其他的都不变。猜测只有 \(\alpha,\beta\) 这两条链会变,其他的没影响。
根为 \(u\) 时,若 \(\alpha\ge\beta+s\),\(u\) 的链就不往 \(v\) 走,两条链长的集合是 \(\{\alpha,\beta+s\}\)。
若 \(\alpha<\beta+s\),\(u\) 的链就往 \(s\) 走,\(\alpha\) 那条就是别的链,链长集合还是 \(\{\alpha,\beta+s\}\)。
类似的,根为 \(v\) 时,链长集合是 \(\{W-s+\alpha,\beta\}\),也就是说换根是把 \(S\) 中 \(\{\alpha,\beta+s\}\) 改成 \(\{W-s+\alpha,\beta\}\)。
求 \(\alpha,\beta\) 是简单的,随便做 dp 就行。
洛谷P7013 [CERC2013] History course
二分,设要对 \(mid\) 进行 check。考虑从左到右填区间。
对一个没填的区间,设 \(p_x=i\) 填了的区间中与 \(x\) 有交的最左位置是 \(i\),对这个区间的限制是要填到 \(\le i+mid\)。
设 \(f_i\) 表示 \(p_x=i\) 的 \(x\) 个数,目前 \([t,n]\) 没填,\(g_i=\sum_{j=t}^{i}f_j\)。你发现无解是 \(\exists i,g_i>i-t+1\)。
若有解,设 \(j\) 为最小满足 \(g_j=j-t+1\) 的位置,每次填 \(p_i\in[p,j]\) 的区间中右端点最小的,就对了。
至于不交区间的限制,若存在两个区间不满足这个限制,你发现他一定不满足这个贪心。
把区间按左端点排序,根据贪心策略,你发现 \(p\) 是不减的,而且最多变化一次。
然后就是 DS 了。你发现可以用一棵线段树维护 \(\sum_{j=t}^{i}f_j-i\),另一棵用来找每次填的区间,就做完了。

浙公网安备 33010602011771号