6 月做题记录
1 P12462
\(q=1\) 是经典贪心问题,先建立区间 \([l,r]\) 虚树,找出直径以某个直径端点为根做长剖,取前 \(k-1\) 大路径长度求和即为答案,证明显然。
考虑原题,我们有以下两个引理:
- 对于任意 \(k\),存在选 \(k\) 个点的最优策略使得这 \(k\) 个点是选 \(k+1\) 个点时某个最优策略子集。根据上述贪心直接得证。
- 考虑区间 \([l,x]\) 和 \((x,r]\),记 \(S\) 为 \([l,x]\) 根据上述贪心选 \(k\) 个点的最优集合,\(T\) 为 \((x,r]\) 根据上述贪心选 \(k\) 个点的最优集合,则区间 \([l,r]\) 的贪心得到的最优集合 \(H \subseteq S \cup T\)。证明考虑区间 \([l,r]\) 建虚树后取的 \(k\) 大长链,显然必然是两个区间的前 \(k\) 大长链,否则不优。
引理 \(2\) 中合并的方法就是,直接把左右两侧最优点的并拉出来建虚树然后跑一次贪心。
根据上述引理,可以看出做法大概形如在区间 \([l,r]\) 中保留 \(O(k)\) 个关键点建虚树跑贪心算法。
考虑怎么保留 \(O(k)\) 个关键点。
以 \(k_{\max}=100\) 分块,则有 \(O(\dfrac{n}{k})\) 个块,对于这些块维护 ST 表,每个 \(f_{i,j}\) 记录这些块在 \(k=k_{\max}\) 时选取的最优集合。合并的时候建虚树即可。
对于查询,把整块和散块集合都拉出来建虚树做贪心即可。
考虑复杂度和实现细节,有 \(O(\dfrac{n}{k})\) 个块,做 ST 表,复杂度为 \(O(n \log n)\)。查询复杂度为 \(O(qk)\),总复杂度 \(O(n \log n + qk)\)。
细节上,你需要写一个 \(O(1)\) 查询的 LCA,并且需要维护按照 DFN 排序的集合才能线性构建虚树,查询时需要把集合按照 DFN 归并,否则可能会在一些地方多个 \(\log\),但可能也能过。
2 P12562
相当于是你要动态维护一个叶子集合 \(S\),支持查询 \(S\) 到 \(u,v\) 简单路径的最短距离最小值。
考虑直接树剖,类似重链剖分维护动态 DP 的套路,对于每个点维护其所有轻子树内的在 \(S\) 内的点到这个点的最短距离,就可以解决查询了。显然修改只会影响 \(O(\log n)\) 个点的值。询问 LCA 往上的要特殊处理一下,是比较简单的。
3 QOJ9518
有两种简单的暴力,分别是修改时枚举所有 \(0\) 的位进行贡献,或者查询枚举所有是 \(1\) 的位进行贡献。
把这两种结合,对二进制前一半的位做第一种,后一半做第二种,单次复杂度 \(O(2^{\frac{n}{2}})\)。
然而事实上我们还有一种暴力。修改时枚举 \(1\) 的位进行贡献,查询枚举 \(0\) 的位进行贡献并将非 \(0\) 位取反。正确性考虑任意一次修改 \(S\) 对查询 \(T\) 的影响,考察有多少 \(H\) 使得修改 \(S\) 时会修改 \(H\),且查询 \(T\) 时会查询到 \(H\)。上述过程描述的即为 \(H \subseteq S\),且 \(H \subseteq \bar{T}\),若 \(S \subseteq T\),则 \(S \cap \bar{T} = \varnothing\),此时只有 \(H = \varnothing\) 符合条件,故贡献为 \(1\)。若 \(S \nsubseteq T\),则存在某一位 \(S_i = 1\) 且 \(T_i = 0\),所以 \(S \cap \bar{T} \neq \varnothing\),此时贡献次数为 \(2^{|S \cap \bar{T}|}\),为偶数,故贡献抵消。
考虑结合三种暴力。对于每一位考虑三种算法,分别是修改时若为 \(0\) 则枚举,或者查询时若为 \(1\) 则枚举,或者是修改时为 \(1\) 则枚举,查询时为 \(0\) 则枚举,否则把这一位视作 \(0\)。不难逐位证明这样做的正确性。
事实上这个东西本质就是模 \(2\) 意义下的矩阵乘法分解:
\(\begin{bmatrix} a_{0,0} & a_{0,1} \\ a_{1,0} & a_{1,1}\end{bmatrix} \times \begin{bmatrix} b_{0,0} & b_{0,1} \\ b_{1,0} & b_{1,1}\end{bmatrix} = \begin{bmatrix} 1 & 1 \\ 0 & 1\end{bmatrix}\)
则第一种算法相当于:
\(\begin{bmatrix} 1 & 1 \\ 0 & 1\end{bmatrix} \times \begin{bmatrix} 1 & 0 \\ 0 & 1\end{bmatrix} = \begin{bmatrix} 1 & 1 \\ 0 & 1\end{bmatrix}\)
第二种算法相当于:
\(\begin{bmatrix} 1 & 0 \\ 0 & 1\end{bmatrix} \times \begin{bmatrix} 1 & 1 \\ 0 & 1\end{bmatrix} = \begin{bmatrix} 1 & 1 \\ 0 & 1\end{bmatrix}\)
第三种算法相当于:
\(\begin{bmatrix} 1 & 0 \\ 1 & 1\end{bmatrix} \times \begin{bmatrix} 1 & 1 \\ 1 & 0\end{bmatrix} = \begin{bmatrix} 1 & 1 \\ 0 & 1\end{bmatrix}\)
对于每一位随机取三种算法中一种进行,不难证明对于固定的 \(S\),所有 \(3^n\) 种算法方案中的复杂度和为 \(O(4^n)\),所以单次修改或查询复杂度期望 \(O({\frac{4}{3}}^{n})\)。
更进一步,由于原题只需要维护 \(0\) 或 \(1\),考虑将序列每 \(w\) 个数分一段用一个整数储存,期望复杂度降至 \(O({\frac{4}{3}}^{n-\log w})\)。
另外,单点加子集求和也可以用相同的做法,只需要把第三种算法的矩阵改为:
\(\begin{bmatrix} 1 & 0 \\ 1 & -1\end{bmatrix} \times \begin{bmatrix} 1 & 1 \\ 1 & 0\end{bmatrix} = \begin{bmatrix} 1 & 1 \\ 0 & 1\end{bmatrix}\)
这样就不依赖于模 \(2\) 了。
4 P12463
由于要求权值最大,考虑 \(|x-y| = \max(x-y,y-x)\),所以把贡献的绝对值都拆开,然后变成了一个费用流问题。建模大概是左侧有 \(O(1)\) 个点表示所有绝对值的拆法,然后 \(S\) 连向所有给定的插入的点,插入的点连向左侧点,左侧点连向给定的 \(n\) 个整点,\(n\) 个整点连向 \(T\) 就行。
注意到左侧点只有 \(O(1)\) 个,所以增广路只需要在左侧这些点里跑 SPFA,只需要维护左侧两对点 \(u,v\) 的经过 \(u \rightarrow w \rightarrow v\) 的最大权值,其中 \(w\) 是右侧点。这个东西在加删边时可以简单维护。
总复杂度 \(O(n \log n)\)。
5 P11235
容易发现询问区间 \((l,r)\) 必然是笛卡尔树子树区间,所以本质只有 \(O(n)\) 种查询。
然后你考虑对于这个区间,你保留的数就是笛卡尔树对应点子树内包含这个点的一个连通块,所以要对每个点选子树内包含其的一个连通块,最大化选的点和区间左右两侧的两个数的平均值。
这不是我们 长野原龙势流星群 吗?直接套用那个 DP 保留上凸部分做闵可夫斯基和就好了。复杂度 \(O(n \log^2 n)\)。
6 5.27 联考 T1
根据切边等价及其相关经典结论可以知道,删去两条边图不连通等价于其中一条为割边或两者切边等价,也就是所有非树边在链上覆盖的区间要么同时包含这两条边,要么同时不包含。
加边时维护等价类,对每个点维护 \(pre_i\) 和 \(nxt_i\) 表示其同一等价类内的上一个和下一个元素,每次加边找出所有等价类修改的位置然后启发式分裂即可。
7 5.27 联考 T2
我们声称对于区间 \([a,b]\),若两步之内无论如何都不可能结束,则结果和 \([a+1,b-1]\) 一样。两步之内会结束的区间只有 \(O(n)\) 个,对这些区间记搜就好了。
证明大概是,考虑写出 SG 值 \(\mathrm{sg}(a,b)\) 的转移,对 \(\mathrm{sg}(a+1,b-1)\) 分类讨论即可得到这个结论。具体地就是 \(\mathrm{sg}(a,b)=\mathrm{MEX}\left(\mathrm{sg}(a,b-1),\mathrm{sg}(a+1,b)\right)\),然后把里面的 \(\mathrm{sg}\) 继续拆开就好了。
8 P11236
做法大概是,你考虑一个 \(a>b<c\) 的结构,中间这个 \(b\) 如果能合并到 \(\min(a,c)\) 并恰好合并完,那么必然会合并。如果合并不完,那么两侧完全独立,可以随意分配 \(b\) 给 \(a\) 或 \(c\),于是你可以线段树维护两个单峰序列,分别是你的所有 \(b\) 都给左侧时左侧的结果,以及所有 \(b\) 都给右侧时右侧的结果,只需要记左右的原因是中间的所有段都不可能向外发生合并了。复杂度 \(O(nv \log n)\)。
9 P12559
显然你要选一个 \(x \geq 2^k\),所有大于 \(x\) 的数贡献为 \(2\),小于等于 \(x\) 的数贡献为 \(1\),其中 \(k\) 为区间内所有数最高位的 \(1\) 的最大值。
不难转化为,\(q\) 次询问区间 \([l,r]\),记 \(f(x)\) 为区间内小于等于 \(x\) 的数的个数,求 \(\max \limits_{x} \{f(x)-x\}\)。
注意到这个形式类似 Hall 定理,考虑左侧点是区间内的数,右侧点是 \(1,2,3,\cdots\),每个左侧点连向右侧一段前缀,这个值就是失配数量。
左侧点连向右侧前缀的最大匹配可以贪心求出,具体地,以任意顺序考虑左侧每个数 \(x\),与右侧 \(\leq x\) 的最大数匹配,不存在则跳过。不难证明正确性。
考虑对右端点扫描线,并且维护贪心顺序为 \(r,r-1,\cdots,1\) 的匹配集合。加入 \(a_r\) 后最多替换一个匹配集合中的数,找到这个数可以简单用 Hall 定理形式判断。由于强制在线所以需要把扫描线过程可持久化。
10 P11343
经过路径中除了终点外,其他点的 \(b\) 应该单调下降。
按照 \(b\) 从大到小 DP,可以得到 \(f_i = \min \limits_{j} \{f_j + a_j + b_j \times \mathrm{dis}(i,j)\}\)。
这个 DP 直接点分树每个点维护子树的动态开点李超树就行。由于这里加入的直线是全局加入,所以李超树是一个 \(\log\) 的,总复杂度 \(O(n \log n \log V)\)。
11 P11346
问题很容易被转化为,一个连通区间图,每次删掉一个非割点,最终删掉所有点,求删除序列方案数。
考虑把删变成加,也就是把序列翻转,则非割点限制等价于加点序列任意一个前缀连通。
直接 DP 是 \(f_{i,l,r}\) 表示加了 \(i\) 个点,目前区间并集为 \([l,r]\)。转移要么选 \([l,r]\) 的某个子区间,或者扩展 \([l,r]\)。
状态数太多了,希望把 \(i\) 删掉。考虑整个过程的本质。把每个 DP 值的贡献画成一条链,发现转移其实是若干次的 \([l,r] \rightarrow [l',r']\) 和若干次 \([l,r]\) 内选一个子区间。只保留 \([l,r] \rightarrow [l',r']\) 的链,并把选子区间的转移挂在第一个链上符合条件的节点上,则一棵这样的树对答案的贡献为其拓扑序数量,也就是 \(\dfrac{n!}{\prod sz_u}\),发现 \([l,r] \rightarrow [l',r']\) 时,\([l',r']\) 的子树大小只和 \([l,r]\) 有关,所以记 \(f_{l,r}\) 表示现在关键链最后一个节点为 \([l,r]\) 时所有答案的和,转移容易前缀和优化,复杂度 \(O(n^2)\)。
12 CF1671F
神秘题。
考虑把排列分为若干极小段 \([l_1,r_1],[l_2,r_2],\cdots,[l_k,r_k]\),其中每一段都满足 \(p_{l_i}\) 到 \(p_{r_i}\) 恰好覆盖了值域上 \(l_i\) 到 \(r_i\)。
不难发现所有逆序对和下降数都只能在段内贡献。不难发现 \(l_i \neq r_i\) 的 \(i\) 数量不超过 \(11\),\(l_i \neq r_i\) 的 \(\sum r_i-l_i+1\) 不超过 \(22\)。
简单 DP 可以求出所有 \(g_{i,j,k}\) 表示长度为 \(i\) 的段,逆序对数量为 \(j\) 且下降数数量为 \(k\),就可以 \(O(k^7)\) DP 预处理,查询直接枚举段数与段总长即可做到 \(O(k^7+Tk^3)\)。
13 P12671
由于询问随机,可以枚举所有长度为 \(l_2\) 的本质不同回文子串,然后判断前 \(l_1\) 个字符是否回文就行了。
求所有本质不同回文子串哈希就行。
14 QOJ7987
简单题。
直接模拟是 \(O(n^2)\) 的,但不难注意到枚举 \(k\) 后本质上要做的就是序列按 \(k\) 分段然后依次求交然后维护大小,直接 bitset 即可,复杂度 \(O(\dfrac{n^2}{w})\)。
15 P9521
大概是你要注意到有些行列永远不会走,具体来说其实只需要保留行列分别保留上凸部分。
然后你从终点往起点做,容易推出来每次走行或走列的充要条件是比较两侧斜率。然后就可以直接模拟了。
16 P9907
考虑分类讨论一下一些东西,大概就是建出 DFS 树,考虑选择的边是树边或非树边。树边容易处理,非树边可能需要 DS 维护一下,但应该不是很困难。
17 ARC160E
套路题。
根据经典结论,叶子数量为偶数时答案就是叶子点权和,容易证明下界,构造只需要求带权重心然后每次删最大的就行了。
叶子数量为奇数时,一个想法是删掉一个叶子然后做偶数的情况,再将这个叶子与剩余部分最小点连边。这个做法大致是对的,细节上有一些 corner 需要讨论,大概就是任意一个叶子的父亲都是二度点,删掉就会导致父亲变为叶子,处理方法也很简单,我们知道任意点双连通图可以被开耳分解构造,所以从某个叶子不断往上跳,直到第一个非二度点即可。具体地你需要考虑以每个点为根分别判断是否存在这样的叶子,但比较容易看出只有点权前 \(O(1)\) 小的点作为根才有意义,所以复杂度是对的。
18 ARC158F
不难注意到排序的本质是,从后往前考虑每种排序规则,最后考虑原序列的顺序。所以显然可知对于每一种排序规则只需要保留最后一次,如果确定了最后出现的排序规则的排列,大小为 \(|S|\),则原方案数就是 \(\begin{Bmatrix} m \\ |S|\end{Bmatrix}\),证明大概就是你要把这 \(m\) 个下标分到这些集合,然后由于顺序确定所以集合是无序的,这个直接容斥就能求,当然没注意到这个也可以矩阵快速幂,不是复杂度瓶颈。
然后考虑怎么刻画最后出现的排序,这个东西考虑直接状压 DP,发现对于目前集合 \(S\),加入第 \(x\) 位是否仍符合条件和 \(S\) 具体是什么无关。更具体地只需要考虑对于 \(i\) 与 \(i+1\),若在 \(x\) 位顺序不对,则要求 \(S\) 内存在某一位使得 \(b_i\) 严格小于 \(b_{i+1}\),这个可以直接对每一位做高维前缀和,然后轻松做到 \(O(kn+k^22^k+k^2\log m)\),已经可以通过了。
事实上对每一位做高维前缀和是不必要的,因为你只需要维护一个本质上是只有 \(0,1\) 的高维前缀或,这个东西压位在一起就行了。复杂度 \(O(kn+k2^k+k^2\log m)\)。
19 QOJ4892
容易发现存在方案使得每个 \(a_i\) 的取值仅包含于所有包含它作为条件的 \(x\) 中,所以每个数总取值数量是 \(O(n)\) 级别的。
在此基础上不难建出 2-SAT 模型,具体来说大概是一些 \([a_i>x]\) 和 \([a_i\leq x]\) 的 \(01\) 变量,然后直接做就行了。
20 P5972
考虑目前已经确定了 \([1,i]\) 的结果,记什么状态能刻画后面的数被选时逆序对的增量。
\([i+1,n]\) 把值域分为了 \(n-i+1\) 段,只需要记录每段内选入子序列的数量即可。
容易发现这个东西的最大状态数肯定是每段内数量尽可能平分,状态数为每段数量 \(+1\) 的乘积,总状态数不超过 \(\sum \limits_{i=1}^n \left(\dfrac{i}{n-i+1}+1\right)^{n-i+1}\),这个状态数是可以接受的,然后就过了。
实现上需要精细一些。
21 P4117
考虑每次修改时,如果最大值 \(m \leq 2x-1\),则暴力把值在 \((x,2x)\) 内的所有数减去 \(x\), 则使用了 \(O(m-x)\) 的复杂度将最大值修改为了不超过 \(x\)。
如果最大值 \(m > 2x-1\),则将小于 \(x\) 的数加上 \(x\),然后全体减 \(x\),用了 \(O(x)\) 的复杂度将最大值减去了 \(x\)。
所以上述的过程的复杂度正确性容易势能分析,然后你需要分块,对于每一块维护并查集就可以快速维护每个位置实际的值了。空间上有问题可以离线每块单独处理。
22 6.3 联考 T1
考虑每次询问的答案是什么,考虑最靠后的包含这个位置的修改,如果是区间覆盖则答案确定,否则答案应该是在交换前的时刻的被交换的值。
容易求出每个询问的答案到底是什么,按照 \(r\) 扫描线维护即可做到 \(O(n \log n)\)。
23 6.6 联考 T1
容易知道答案应该是区间 \([l,r]\) 的最大值,其中 \([l,r]\) 的值是,初始 \(l=r=k\),依次对于每个 \(i=R,R-1,\cdots,L\),若操作区间 \([x_i,y_i]\) 和 \([l,r]\) 有交,则 \([l,r]\gets [l,r]\cup [x_i,y_i]\)。
考虑把 \(l,r\) 拆开,以 \(l\) 为例,则每次操作即为,若 \(y_i > l\),则 \(l \gets \min(l,x_i)\)。这个东西可以直接建树然后在树上倍增。复杂度 \(O(n \log n)\)。
24 6.6 联考 T2
有点厉害的题。
考虑怎么求一个序列的最长 \(k\) 间隔子序列,显然是 DP,\(f_{i,j}\) 表示前 \(i\) 个数,结尾的值为 \(j\) 时子序列长度的最大值。转移形如 \(f_{i,j} = \max \limits_{x \in [j-k,j+k]} \{f_{i-1,x} + 1\}\)。
然后记 \(g_{j} = \max \limits_{x \in [j-k,j+k]} f_{i,x}\),考虑在序列末尾加数 \(x\) 对 \(g\) 的修改,发现是 \(g_j \gets \max(g_j,g_x + 1)\),其中 \(j \in [x-k,x+k]\)。判定则是判断 \(\max g \leq l\)。
对给定的 \(a\) 可以动态开点线段树维护这个 DP,然后考虑在后面怎么加数。
发现加的 \(x\) 必然满足 \(g_x\) 是全局最小值,证明考虑调整。如果现在不进行操作,考虑到最终必然会操作 \(x\),必然不劣。
进一步分析哪个 \(x\) 会被加入,这是因为可能存在多个全局最小值点。考虑把最小值极长连续段拉出来,不难证明连续段之间互不影响,原因是任意两个最小值连续段之间的长度都至少为 \(k\)。所以操作必然相互独立,对于一个连续段 \([l,r]\),贡献就是 \(\lceil \dfrac{r-l+1}{k} \rceil\),用 set 动态维护连续段,在连续段发生合并时更新即可。
25 6.6 联考 T3
首先证明:圆心连的边数不超过 \(2\)。
考虑若圆心连了至少三条边,取出相邻的三条,存在两条边使得圆心符号相同,如果这两条边在的顶点连线与另一条边没有交,直接调整,否则大概形如这样:

不妨令 \(a \leq c\)。
此时权值为 \(a-o+c-o+o-b = a+c-o-b\)。
将边替换为 \((o,a),(a,b),(a,c)\),权值为 \(a-o+a-b+c-a=a+c-o-b\),和上述权值相同且不造成矛盾。
将环复制一遍变成序列,忽略圆心,考虑区间 DP,\(f_{l,r}\) 表示区间 \([l,r]\) 连通时最小花费,转移枚举分割点 \(m\),并选择一条左右的边,复杂度 \(O(n^3)\)。
询问时分类讨论圆心度数,然后可以简单通过预处理枚举相邻的两个点做到比较快的回答询问,复杂度 \(O(n^3+q\log n)\)。
25 炼石 #23 T1
求 \(k\) 小的常见方式,用堆维护答案。
有一个直接的方法是点分树,这样可能需要对于点分树每个子树建 ST 表,时间复杂度 \(O(n\log^2n + q\log n)\),空间也是 \(O(n\log^2 n)\) 的。
题解做法是建边分树,但其实也差不多。
26 炼石 #23 T2
考虑按照 DFS 序进行 DP,\(f_u\) 表示考虑了 \(u\) 及之前的点,且 \(u\) 被选为最终叶子的总答案。
每次扩展目前 DFS 序下面的一条左链,发现能被转移过去的点只有一条右链,树上相邻叶子距离和是 \(O(n)\) 的,直接转移就是对的。
27 炼石 #23 T3
把三角剖分双射成对偶图,显然是完全二叉树。
发现向左儿子走的边就是关键边,限制变为从根到任何一个叶子的向左儿子走的次数不超过 \(m\)。
把完全二叉树双射成括号序,相当于做一个反射容斥。
后面要单位根反演,不会。
28 核桃 #63 T1
考虑对于每个 \(i\) 求出其所有循环中最靠后的成为第一棵的位置,记为 \(f_i\),这个东西有一个显然的暴力更新是,在模 \(n\) 意义下做 \(f_i \rightarrow f_{i+1}\),然后推一下转移。
然后你考虑猜测一个结论,大概是说我可以二分 \(f_1\),最终的 \(f_1\) 必然满足其循环一次后无法重新更新,我们猜测这个能否重新更新是一个单调的,然后就过了。
29 核桃 #63 T2
有点深刻。
把所有可行的 \((x,y)\) 画成左下阶梯,考虑按照权值依次加入每个物品,如何维护可行 \((x,y)\)。
不妨假设 \(x \geq y\),记加入新物品权值 \(w\),加入前物品总和 \(s\),考虑某 \((x,y)\) 在加入前不可行,且 \(x < w\),考虑之后任意物品都不可能用作凑出 \((x,y)\) 的方案中,这是因为 \(x < w\),所以之后 \(\geq x, \geq y\) 的格子必然都不合法。
于是可以知道,对于某一 \(y=y_0\) 的行,若 \((s-y_0,y_0)\) 不可达,则这一行之后不会扩展。考虑什么样的 \(y_0\) 使得加入 \(w\) 后会扩展,必然要求 \((s-y_0,y_0)\) 可达,并且如果能扩展则必然会扩展成 \((s-y_0+w,y_0)\)。
注意到若 \(y_0 > s - w + 1\),考虑能否凑出 \((s-y_0+1,y_0)\),发现 \(w > s-y_0 + 1\),所以之后不可能凑出,所以这一行之后无论如何都不会扩展。反之,若 \(y_0 \leq s - w + 1\),考虑任意 \((s-y_0+k,y_0)\),其中 \(k \in [1,w]\),注意到 \(s-y_0+k - w \in [0, s-y_0]\),所以必然可以扩展。所以我们知道任意时刻能扩展的 \(y\) 可以被动态更新出,也就是存在 \(t\),每次 \(t \gets \min(t,s-w+1)\),所有 \(\leq t\) 的行会被扩展。
由于限定了 \(x \geq y\),所以 \(t \leq \dfrac{s}{2}\),若 \(s-w + 1 < t\),则必然有 \(w \geq 2s\),显然只有 \(O(\log V)\) 个有效的 \(w\),可以直接线段树上二分做到 \(O(n \log n \log V)\)。
30 核桃 #63 T3
31 云斗模拟赛 T1
考虑判定一个集合是否可以成为前若干大的。
分类讨论:
-
\(p \geq v\),问题等价于每次在集合中选 \(v\) 个数加 \(1\),加 \(m\) 次,设能力值分别为 \(a_1,a_2,\cdots,a_x\),集合外最大值为 \(y\),充要条件为 \(\forall 1 \leq i \leq x, a_i+m \geq y\),且 \(\sum \limits_{i=1}^x \max(0,y-a_i) \leq mv\),证明可以归纳。
-
\(p < v\),每次选集合内所有数,和集合外的 \(v-p\) 个数,本质上是对称的。
对这个做 DP 可以简单做到 \(O(n^4)\),可以通过。
32 云斗模拟赛 T2
这个交换的经典过程就是,对于每个点维护 \((i,0)\) 和 \((i,1)\) 表示在这次交换前 \(a_i\) 和 \(b_i\) 的值,容易发现这个图本质上就是若干条链,直接弹飞绵羊就好了。
分块过不去也不需要写真正意义上的 LCT,用平衡树就能直接维护链的分裂合并。
33 云斗模拟赛 T3
首先把最小生成树计数转为生成树计数,大概就是 kruskal 过程中对相同权值的所有边和之间的连通块视为一棵树然后做,正确性可以通过任意一种权值前缀得到的连通块唯一确定证明。
对于连通块计数,由于 \(D \leq 7\),考虑建出 DFS 生成树,则树高不超过 \(D\),按照 DFS 序加入每个点,发现之前加入的所有点必然都和新加入点到根的某个点连通,否则之后不可能连通,所以 DP 时记这个点到根的路径上的点的连通状态即可,复杂度 \(O(m\mathrm{Bell}(D))\)。
34 炼石 #22 T1
每个连通块是基环树或树,树有 \(n\) 种定向方式,基环树有 \(2\) 种。
然后 \((X,Y)\) 必然在下凸包上,所以每个连通块只需要保留下凸包上的点,对不同连通块闵可夫斯基和即可。
35 炼石 #22 T2
简单题。
考虑 \(i=1\) 怎么做,从前往后 DP,但是不能记 \(x\) 具体值,考虑我们只关心 \(f(s)\) 和 \(r\) 的大小关系,考虑记 \(f_{i,j,k}\) 表示前 \(i\) 个位置,现在 \(x\) 和 \(r\) 第一个不同位置为 \(j\),\(j\) 及后面的位总共有 \(k\) 个 \(1\),转移显然,复杂度 \(O(nk^2)\)。
对于限定 \(s_i=0\),也很简单,直接对后缀也做一个一样的 DP 并且拼在一起就行了。
36 炼石 #22 T3
完全不会数论。
\(ax \equiv b \pmod i\) 可以转化为 \(ax+ki=b\),则 \(k=\dfrac{b-ax}{i}\),因为 \(x\geq 0\) 所以 \(b-ax\leq b\),若 \(i>b\),则 \(k < 0\),求最小的 \(x\) 等价于求最大的 \(k\)。将 \(k\) 取相反数可知 \(ax-k'i=b\),即求最小的 \(k'\),这个值等于 \(f(i,-b,a)\)。所以我们只关心 \(i \bmod a\) 的值,剩下的就随便做了。
37 炼石 #19 T1
考虑 min-max 容斥的期望形式,\(E(\max \limits_{i \in S} i) = \sum \limits_{T \subseteq S} (-1)^{|T|-1}E(\min \limits_{j \in T} j)\)。
然后这个东西直接从左到右做轮廓线 DP 就行了。
38 炼石 #19 T2
考虑分裂过程中不能分裂到目前存在的点上,这个限制并不好看,事实上可以证明,忽略这个限制,最终的可构成局面一致,证明大概是你考虑在这种情况下你可以把所有分裂过程按照最终的结果钦定一个顺序,可以调整成不交。
然后可以发现过程中如果一个点上的数量大于等于 \(4\),之后的任意分裂都不可能使得每个点都只有一个,这个手玩一下就能看出。
然后按照这个写一个 DP,\(f_{i,\{0/1/2/3\}^4}\) 表示 \(i\) 次分裂目前最靠右的列的四个值是什么即可。
39 炼石 #19 T3
有点厉害的题。
若 \(x,y\) 已知,直接分治显然做到了最优的次数,为 \(\lceil \log_2 n \rceil\),原因是每次你的候选集合最坏情况下最优也只能除以 \(2\)。
当 \(x,y\) 不确定时,我们可以说明 \(n=2,4,8\) 以外的所有 \(n\) 同样可以做到 \(\lceil \log_2 n \rceil\),而 \(n=2,4,8\) 只能做到 \(\lceil \log_2 n\rceil + 1\)。
首先若 \(n \neq 2^k\),考虑从 \(0\) 到 \(n-1\) 编号,对每个位询问这一位为 \(1\) 的编号的重量和,显然存在一个位使得这一位为 \(1\) 的都是真的,所以可以求出 \(x,y\),从而求出假币编号每一位。
\(n = 2^k\) 且 \(n \neq 2,4,8\) 时,考虑一些很神秘的分类讨论,大概思路是我需要提前做 \(a\) 次询问求出 \(x,y\),并且将 \(n\) 的规模减小到原来的 \(\dfrac{n}{2^a}\),去做那个 \(x,y\) 确定时的分治。细节就是你讨论一堆东西,不想写了。
40 炼石 #18 T1
首先这个东西相当于是一个形如 \(f_i = \max \limits_{j \in [l_i,r_i]} \{f_j+i\}\),其中 \(+\) 是集合插入。
这个东西可以直接主席树维护每个点的集合,以及权值哈希就可以维护比较。注意到这里的 \([l_i,r_i]\) 是一个可以单调队列维护的形式,所以复杂度是 \(O(n \log n)\) 的。
41 炼石 #18 T2
树是经典的贪心问题,维护那个和父亲合并的优先队列就可以了。
对于 DAG,本质上就是取出一棵叶向生成树,记每个点入度为 \(d_i\),有一个 \(O(\prod d_i \times \mathrm{poly}(n))\) 的做法,就是对每个点枚举父亲。
这个东西的限制是 \(\sum d_i = m\),最大化 \(\prod d_i\)。显然连续的情况下取 \(d_i\) 全部相等最大,对于比较大的 \(n\),这个值不会太大,可以直接做,否则可以直接 \(O(2^n\mathrm{poly}(n))\) 的状压 DP,可以通过。
42 炼石 #18 T3
直接刻画 OGF 然后多项式快速幂有点蠢,考虑求 \(f(i,j)\) 表示 \(i\) 个括号串,有 \(j\) 个左括号的方案数。
我们声称 \(f(i,j) = \dbinom{i+2j-1}{j} - \dbinom{i+2j-1}{j-1}\),证明大概是你把 \(f\) 的递推式求出来然后可以归纳证明。
限定 \(k\) 个是简单的,直接容斥就行了。
43 炼石 #17 T1
这个题是比较简单的。
你考虑先求出一个 MST,删掉一个点的本质就是对其所有儿子子树和父亲外的那部分做一个新的 MST。然后你考虑什么样的非树边有意义。发现如果这条边是儿子子树之间的,那么这条边只会在 LCA 处影响答案。另一方面是子树内到外的边,这个是 trival 的,咋做都行。然后由于所有点度数和是线性的,对于每个点做一个新的 MST 即可。
44 炼石 #17 T2
树上路径统计,直接上点分治。
这个东西大概形如 \(a_x \oplus a_y \leq d_x \oplus d_y \oplus a_w\),枚举 \(x\) 则限制变为 \(a_y \oplus k_1 \leq d_y \oplus k_2\),枚举 \(a_y \oplus k_1\) 和 \(d_y \oplus k_2\) 的 LCP,在 trie 树上简单维护即可。
45 炼石 #17 T3
注意到 \(g(n)\) 的求法应该是贪心,每次选取 \(\leq n\) 中因数个数最大的最小的数 \(x\),然后 \(g(n)=d(x)!+g(n-x)\)。
不难发现 \(x\) 必然为反质数。
大于等于 \(10^9+7\) 的数阶乘为 \(10^9+7\) 的倍数,只需要考虑 \(< 10^9+7\) 的反质数,显然反质数数量不多,可以打表先求出来。
对于每个反质数 \(x\),要求 \([1,n]\) 中有多少数求 \(g\) 中会用到这个数,考虑到不可能在过程中选两个 \(x\),这是因为不如选 \(2x\),所以考虑 \(f_n\) 表示 \([1,n]\) 中用到 \(x\) 的数,记 \(m\) 为小于等于 \(n\) 的最大反质数,显然 \(m \geq \dfrac{n}{2}\),分类讨论 \(i < m\) 或 \(i \geq m\) 可得形如 \(f_n = f_{m-1} + f_{n-m}\),记忆化搜索,不难证明状态数是对的,原因是只考虑所有非平凡状态,也就是不为 \(m-1\) 形式的状态,发现其递归 \(O(\log n)\) 次之后必然变为 \(1\),所以是对的。
细节上你需要实现高精度,有点蠢了。
46 CF1924D
考虑如何求最长子序列,从前往后贪心,维护目前左括号数量 \(x\),每次遇到左括号时,\(x \gets x+1\),遇到右括号时,若 \(x>0\),则 \(x \gets x-1\),\(ans\gets ans+1\),否则不变。最终 \(2 \times ans\) 即为最长子序列长度。
考虑用坐标 \((x,y)\) 表示目前前缀的左和右括号数量,则这是一个 \((0,0)\) 到 \((n,m)\),每次往右或往上的线段,考虑如何刻画有多少个右括号加入时没有左括号与之配对,第一次显然是第一个满足 \(y=x+1\) 的位置,第二次则是第一个 \(y=x+2\) 的位置,以此类推。要求最长合法括号序列长度恰好为 \(2k\),本质就是限制恰好经过 \(y=x+(m-k)\),但是没有经过 \(y=x+(m-k)+1\)。
根据反射容斥可知答案为 \(\dbinom{n+m}{k} - \dbinom{n+m}{k-1}\)。
47 6.12 联考 T1
对于单个子树,这个东西的贪心结论是经典的 CSP-S 2023 T4,即按照结束时间从小到大选择,不难证明正确性。
考虑这个东西的本质,相当于我对子树内按 \(t\) 排序得到的是 \(v_1,v_2,\cdots,v_k\),从前往后考虑每个点 \(v_i\),若其未被覆盖则覆盖这个点到根的路径。我们称一个点 \(u\) 是好的当且仅当按照上述贪心策略到点 \(u\) 时 \(u\) 未被覆盖。
考虑对于每个子树按照 \(t\) 小到大维护若干 \((v_i,x_i)\) 表示某个好点 \(v_i\) ,覆盖到的时间为 \(x_i\),则答案就是 \(\min \{t_{v_i}-x_i\}\),必要性显然,充分性考虑一个不好的点如果超过期限,则子树内一定存在某个好点也超过期限。
考虑合并两棵子树怎么做,发现两棵子树相对独立,直接启发式合并对于较小的子树按照 \(t\) 顺序插入到较大的子树的位置中,复杂度 \(O(n \log^2 n)\),不知道能不能过。
上面的过程可以直接线段树合并做到 \(O(n \log n)\),不过细节要多一点。
48 云斗模拟赛 T1
为什么我完全不会计数啊。
考虑把无标号无根树钦定根为重心,考虑计算无标号有根树的数量。
记 \(f_{i,j}\) 表示 \(i\) 个点且根目前有 \(j\) 个儿子的树的数量,但是直接转移无法刻画度数,考虑记 \(g_{i,j,k}\) 表示 \(i\) 个点,根目前有 \(j\) 个儿子,并且钦定根最后必然有 \(k\) 个儿子的树的数量。
考虑转移,对于 \(f_{i,j}\),枚举 \(x,y,z,k\),考虑给 \(g_{x,y,z}\) 的状态中加入 \(k\) 个,要求 \(ik+x \leq n\),贡献系数是插板得到的 \(\dbinom{f_{i,j}+k-1}{k-1}\),这个东西复杂度是调和级数 \(O(n^5 \ln n)\)。
然后特殊性质可以优化掉一个 \(n\),就能过了。
49 云斗模拟赛 T2
考虑 \(u\) 喜欢 \(v\) 到底意味着什么。
求出原树直径,设其端点为 \(x,y\),不妨假设 \(x\) 距离 \(u\) 更远,则 \(v \in \mathrm{path}(u,x)\)。
以 \(x\) 为根,考虑符合条件的 \(v\) 在哪些位置。不难发现对于点 \(u\),找到深度最大的其喜欢的祖先 \(k\),则视为将 \(k\) 的 \(u\) 这部分子树删去后,\(k\) 喜欢的所有点都被 \(u\) 喜欢,且 \(u\) 还喜欢 \(k\)。
这个 \(k\) 可以在 DFS 过程中简单用线段树维护,于是你可以构建一棵新的树,每个点喜欢的点就是到根的所有点,之后的询问可以简单分块做到 \(O(n \sqrt n)\),但是离线下来 DFS 做分块常数太大了,评测机太慢了啥都过不去,于是写了个主席树做到 \(O(n \sqrt{n\log n})\),只能获得 \(72\),诋毁评测机。
50 云斗模拟赛 T3
大概意思是说你把每种颜色相邻的对拉出来考虑,如果这些对没有发生变化可以变成树上问题。这个原因大概是说考虑两个不包含且不只在端点相交的区间,发现其中较小的那一对肯定不符合条件,从而可以对区间建树。
进一步,有修改会影响相邻对,但是总数量是线性的,所以你可以离线下来做线段树分治,这样就可以做到两个 \(\log\) 了。
51 核桃 #64 T1
这个就是,你建出圆方树然后考虑一条简单路径到底是什么,编一下 DP,好像要换根,但都不难。
52 核桃 #64 T2
考虑这个东西本质就是每个位置必须选择变成左括号或右括号,分别花费 \(x_i\) 和 \(y_i\),最终得到的最长括号子序列的每一对左右括号都能贡献 \(k\) 的正收益,要求净收益最大。
考虑钦定所有括号都为左括号,然后选一些变为右括号,如果钦定每个右括号都能匹配,问题转化为每个点有个点权,选若干个位置最大化权值和,要求每个前缀选的不超过一半。
但问题在于有些右括号可能失配,但是其选为右括号可能仍然有正收益,为了解决这个问题,考虑在序列前面加入 \(n\) 个位置,其 \(x_i=k\),\(y_i=0\),若前面的位置有左右括号匹配,则贡献为 \(-k+0+k=0\),若一个后面的右括号没有匹配,必然和之前的某个虚拟的左括号匹配,贡献为 \(-k+y_i+k=y_i\),符合要求。但是有一种可能是前面恰好多出来一个左括号无法匹配,再做一次前面加入 \(n+1\) 个虚拟位置的即可。
问题转化为之前那个选若干位置使得每个前缀不超过一半,直接 DP 是 \(f_{i,j}\) 表示前 \(i\) 个选了 \(j\) 个的最大值,这种东西是比较显然的凸优化,不难归纳证明 \(f\) 是凸的,维护差分然后直接做就行了,这个东西和反悔贪心本质上是类似的。复杂度 \(O(n \log n)\)。
53 核桃 #64 T3
54 CF403E
这个题应该比较容易。
大概就是你分开维护一下 DFS 序,然后线段树就可以直接维护了。
55 ARC200E
难点可能在于,先考虑假设 \(a_1=0\),然后将答案乘以 \(2^M\) 即可,因为每一种 \(a_1 =0\) 的序列对应 \(2^M\) 种序列,分别是 \(a_1\oplus x, a_2 \oplus x, \cdots, a_n \oplus x\),其中 \(x \in [0,2^M)\)。
\(a_1 = 0\) 后,限制变为 \(\forall 1 \leq i \leq n, \mathrm{popcount(a_i)} \leq 2\),并且仍然有任意两个异或后大小不超过 \(2\),但此时直接分类讨论有多少种 \(a_i\) 使得 \(\mathrm{popcount(a_i)} = 1\),显然若存在 \(\mathrm{popcount} = 2\) 的数,则至多只有本质不同的两种数使得 \(\mathrm{popcount}=1\),分类讨论一下就能快速算出。
56 CF2113E
直接想法是每个点拆成 \(m\) 个点做分层图最短路,很遗憾,这样做的复杂度是 \(O(nm \log nm)\) 的,无法通过。
考虑对于时刻 \(t=1,2,\cdots\),维护集合 \(S_t\) 表示目前能在的位置,\(S_t \rightarrow S_{t+1}\) 则是,将每个点往邻居扩散一步,然后删去所有在 \(t+1\) 时刻被占据的位置。
注意到每个点进入集合后,最多移出 \(m\) 次,原因是移出其必然要求其被占据。所以每次加入一个点枚举其所有邻点即可,复杂度 \(O(nm)\)。
57 QOJ7088
先做 SA。
位置 \(i\) 和 \(j\) 能连边等价于 \(\mathrm{lcp}(suf_i,suf_j)+\mathrm{lcs}(pre_i,pre_j) \geq j-i+1\)。
这个结构不好看,考虑优秀的拆分,直接按照 \(w\) 小到大枚举然后做调和级数分块,这样可以快速定位出要连边的对应区间。
直接对于每个点维护其并查集的编号,用线段树维护哈希即可做区间连边,复杂度 \(O(n\log^2 n)\)。
考虑快速做区间 \([l,l+2^k)\) 和 \([r,r+2^k)\) 对应点连边,按照 \(k\) 分层维护并查集,若 \(x,y\) 已经连通则跳过,否则分治后在这一层合并 \(x,y\)。不难分析出每个 \(k\) 进入递归的次数为 \(O(n)\),总复杂度 \(O(n \log n \alpha(n))\)。
58 P3347
第一问容易计算,记答案为 \(T\)。
考虑函数 \(f(x)\) 为流量为 \(x\) 时最小费用,则 \(f(T)\) 即为所求。
考虑对 \(f\) 求导得到 \(f'(T)\),即需要求 \(f'\) 在 \(T\) 处的积分。
考虑把连续过程先考虑成极小量的离散形式,对费用求导得瞬时费用 \(2a_ix+b_i\),将 \(S\) 到每个点的边被拆成若干条 \((\epsilon,2a_ix+b_i)\),即求这个图上的最小费用最大流。
考虑费用流增广过程,每一次会选择能增广的左侧点中目前导数最小的增广。\(f'(x)\) 的含义即为,流量为 \(x\) 时,增广的瞬时费用。
考虑函数 \(g(x)\),增广瞬时费用 \(\leq x\) 的增广路后,最大流量是多少。求 \(g(x)\) 关于 \(y\) 轴所成面积即为答案。
考虑 \(g(x)\) 是什么,单独考虑每个点的 \(x\) 与流量的关系,发现是一段 \(0\),一条线段,和一条平行于 \(x\) 轴的线,故 \(g(x)\) 为若干一次函数拼接,有至多 \(2n\) 个拐点。
这个并不完全对,注意到 \(2a_ix+b_i\) 在 \(a_i=0\) 时函数会不连续,所以将 \(0,1,2,3\) 视为断点,断点之间的函数都是连续的且有凸性。
所以可以分治求出整个 \(g\) 的所有拐点,然后积分即可。
59 P8291
很厉害的题。
考虑这个模型大概是说,给你一张 \(n\) 个点有向图,求一个排列 \(p_1,p_2,\cdots,p_n\) 使得 \(p_i \rightarrow p_{i+1}\) 的边存在的数量最多。
先考虑没有重边且图是 DAG,此时每个排列与一个路径覆盖双射,所以即求 DAG 最小路径覆盖,直接建二分图跑网络流求解即可。
这个题中的图可能存在重边和环,先考虑有环怎么做。考虑二分图匹配求 DAG 最小路径覆盖的模型,过程是把每个点拆成入点和出点,每条边 \(u \rightarrow v\) 连接无向边 \(out_u \leftrightarrow in_v\),每个匹配与一组路径覆盖双射。有环时,答案不超过网络流求出的答案,但这个模型会求出一些环并将其视为路径。但这个题有特殊性质,即每个人都有至少一条学术信息,所以可以逐步在环中某个节点处插入学术信息将环断开,这个答案必然可以取到。
对于重边,即形如 a b loushang 和 b a louxia 的边,可以反证出存在最优策略使得这两条信息相邻,不相邻取最优时可以把整体的部分移动到相邻的位置。于是先把这些贪心匹配,然后做无重边的即可。
60 QOJ5374
不会啊。
61 P12445
考虑 \(k=n\) 时答案是多少,这个限制等价于 \(\forall 2 \leq i \leq n,in_i > 0\),且 \(\forall 1 \leq i < n, out_i > 0\)。
同时刻画入度和出度是很麻烦的,考虑从后往前限定每个点都有出边,同时容斥一些入度为 \(0\) 的点,记 \(f_{i,j}\) 表示考虑了 \(i\) 个点,钦定 \(j\) 个点入度为 \(0\),且每个点出度都非 \(0\) 时的总方案数。转移很容易,于是可以对每个 \(n\) 求出 \(n=k\) 的答案,记为 \(h_n\)。
对于 \(k<n\),考虑图应该是先有一个 \(h_k\),然后加入 \(n-k\) 个点,要求每个点要么不能从 \(1\) 到达,要么不能到达 \(n\)。
考虑每个新加入的点,其可能可以从 \(1\) 到达,此时限制其不能到达 \(n\),或者其无法从 \(1\) 到达,此时对这个点没有任何限制。考虑将新加入的点分为这两类,容易发现无法从 \(1\) 到达的点可以向其之后的所有点任意连边而不影响条件合法性,所以贡献就是 \(2^{n-i}\),对于能从 \(1\) 到达的点,则限制其向后只能连接 \(1\) 类点,且每个 \(1\) 类点向前必然有以前加入的点或者 \(1\) 类点向其连边。
将 \(2\) 类点的 \(\prod 2^{n-i}\) 的贡献单独计算,由于 \(1\) 类点以及原来的 \(k\) 个点向后不能连接 \(2\) 类点,所以之间是独立的。对于原 \(k\) 个点和 \(1\) 类点,考虑从前往后 DP,对于每个 \(1\) 类点,要求前面至少一个 \(1\) 类或原有点向其连边,容易记 \(f_{i,j}\) 表示 \(i\) 个点,有 \(j\) 个原有点的方案数,从而进行转移。另外再记一个 DP 就可以将 \(2\) 类点与其他点贡献合并,总复杂度 \(O(n^2)\)。
62 CF1844G
考虑以 \(1\) 为根确定每个点到根距离 \(h_i\)。
首先有 \(h_1=0\),考虑 \(\mathrm{dis}(i,i+1)=h_i+h_{i+1}-2\times h_{\mathrm{LCA}(i,i+1)}\)。在模 \(2\) 意义下,可以求出 \(h_2\bmod 2,h_3\bmod 2,\cdots, h_n \bmod 2\)。
进一步,知道每个数 \(h_i \bmod 2\) 后,可以求出 \(h_i \bmod 4\),以此类推,最终可以求出每个 \(h\)。
63 P3547
考虑最终路径是怎么样的。我们可以证明,路径要么全都是 \(a\) 类边,要么至多一条 \(a\) 类边。
考虑归纳证明这个事实。假设 \(b < 2a\),首先可以知道路径中一定不存在连续两条 \(a\),然后考虑最优路径中一条 \(a\) 类边的下一条是 \(b\) 类边,可以分类讨论将这条 \(a\) 类边向下调整一步,所以最终必然至多只有一条 \(a\) 类边。
所以问题难点在于求 \(k\) 到每个点的最短的长度为偶数的路径,使得路径上不存在 \(u \leftrightarrow v \leftrightarrow w\) 使得 \((u,w) \in E\)。
考虑 BFS 过程每次枚举 \(u\) 的邻点 \(v\) 的邻点 \(w\),若 \((u,w) \notin E\) 则尝试更新 \(dis_w\),然后删除通过 \(v\) 松弛 \(w\) 的边,原因是只要 \((u,w) \notin E\),无论松弛是否成功,对于未出队的 \(x\),\(x,v,w\) 都不可能更新答案,这是因为 \(dis_x \geq dis_u\)。
使用链表模拟这个过程,考虑一对 \((u,v,w)\) 被枚举到但没有删边,当且仅当这是一个三元环。根据三元环计数结论可得复杂度 \(O(m\sqrt m)\)。
64 P12506
显然就是要欧几里德距离 \(\leq r\) 的连边,判定每个连通块是否为二分图。
考虑一个边长为 \(\dfrac{\sqrt 2}{2}r\) 的正方形,其对角线长度为 \(r\),故任意两个在正方形内的点必然有连边。若这个正方形内有至少三个点,必然存在三元环,已经可以判定不为二分图了。
将整个平面划分为无限多个边长为 \(\dfrac{\sqrt 2}{2}r\) 的正方形,每个正方形内如果有至少三个点,那么直接连出一个三元环即可。如果有两个点,则尝试连接这两个点。
考虑正方形之间的边,注意到有边相连的正方形的距离不超过 \(2\),考虑对于每个正方形 \((x,y)\) 枚举其相邻距离小于等于 \(2\) 的所有正方形。此外,可以发现若两个正方形内点数都大于等于 \(3\),这条边是没有意义的。故连边的两正方形必有一个大小不超过 \(2\),所以复杂度是对的。精细实现可以做到线性。
65 P5295
记无向图 \(G=(V,E)\),其点集 \(S \subseteq V\) 的导出子图 \(G_S=(V_S,E_S)\)。
结论:无向图 \(G\) 合法当且仅当对于任意非空集合 \(S \subseteq V\),\(|E_S|\leq 2|V_S|-2\)。
必要性显然,这是因为森林边数最多只有 \(|V_S|-1\) 条,两棵森林则至多 \(2|V_S|-2\) 条。
考虑证明充分性:
我们尝试按照 \(|V|\) 归纳证明。\(|V|=1\) 时显然成立。
考虑 \(|V| > 1\),令 \(d_i\) 表示点 \(i\) 在图 \(G\) 中的度数,考虑取出 \(i\) 为 \(d_i\) 最小的任意一个 \(i\)。
不难发现 \(d_i \leq 3\),原因是若 \(d_i \geq 4\),则 \(|E| \geq \dfrac{|V|d_i}{2} \geq 2|V|\),与 \(|E| \leq 2|V|-2\) 矛盾。
记 \(G'=(V',E')\) 为删去点 \(i\) 与其相邻边得到的图,根据归纳假设,\(G'\) 符合原命题且存在解。
若 \(d_i = 0\),显然符合要求。
若 \(d_i = 1\) 或 \(d_i = 2\),由于 \(G'\) 存在解,将至多两条边分给两棵森林即可。
考虑 \(d_i = 3\)。
称一个点集 \(S\) 为坏的当且仅当 \(|E_S|=2|V_S|-2\)。
对于任意一个满足原命题的图 \(G\),考虑其两个坏的点子集 \(S,T\) 满足 \(S \cap T \neq \varnothing\),则 \(S \cup T\) 也是坏的。
证明:
考虑 \(|E_{S\cup T}| = |E_S| + |E_T| - |E_{S \cap T}| = 2|V_S|-2+2|V_T|-2-|E_{S\cap T}| = 2(|V_{S}|+|V_T|)-|E_{S \cap T}| - 4\)。
又有 \(|V_{S \cup T}| = |V_S|+|V_T|-|V_{S \cap T}|\)。
由于 \(S \cap T \neq \varnothing\),所以 \(|E_{S \cap T}| \leq 2|V_{S \cap T}| - 2\)。
所以 \(|E_{S\cup T}| \geq 2(|V_{S}|+|V_T|)-2|V_{S \cap T}| - 2=2|V_{S \cup T}| - 2\)。
由于 \(G\) 符合结论,故 \(|E_{S\cup T}| \leq 2|V_{S \cup T}| - 2\)。
综上,\(|E_{S\cup T}| = 2|V_{S \cup T}| - 2\)。
考虑用此引理证明原命题。
\(d_i = 3\) 时,设其三个邻居分别为 \(x,y,z\)。
则不存在三个非空坏集合 \(A,B,C \subseteq G'\) 满足 \(x,y \in A\),\(y,z \in B\),\(x,z \in C\),反之,则任意两个集合交集非空,所以 \(A \cup B \cup C\) 为坏集合,而 \(A \cup B \cup C \subseteq G'\),与归纳假设矛盾。
不妨假设不存在坏集合 \(A\) 使得 \(x,y \in A\),则在 \(G'\) 中加入边 \((x,y)\) 得到 \(G''\),\(G''\) 仍符合原命题并存在解,将 \((i,x),(i,y)\) 两条边划分给 \(G''\) 中 \((x,y)\) 边所分配的颜色,将 \((i,z)\) 分配给另一种颜色即可。
证毕。
考虑原题如何进行判定,则我们要求一个集合 \(S \neq \varnothing \subset V\) 使得 \(|E_S|-2|V_S|\) 最大。
考虑对每条边 \((u,v)\) 新增一个点 \(x\),连边 \(x \rightarrow u\),\(x \rightarrow v\),将 \(x\) 点权设置为 \(1\),将原图点的点权设置为 \(-2\),即求最大权非空闭合子图。
直接跑最大权闭合子图显然不对,因为会跑出空集。枚举一个原图点 \(i\) 并钦定其必选然后跑即可做到 \(O(n^2\sqrt n)\)。
进一步,考虑钦定 \(i\) 本质就是删去一条 \(i \rightarrow T\) 的边,那么直接用退流技巧,从 \(i\) 向 \(S\) 跑最大流即可。复杂度 \(O(n^2)\)。
66 U548998
Solution by EuphoricStar,orz。
考虑答案怎么求。记 \(cnt_x\) 表示 \(x\) 的出现次数,即求 \(\sum \limits_{cnt_x+cnt_y \leq k}cnt_xcnt_y\)。
\(cnt\) 的下标范围过大,考虑将原序列每个数按照出现次数是否大于 \(\sqrt n\) 分类,如果能只求出出现次数大于 \(\sqrt n\) 的 \(cnt\),而对其余数维护 \(c_i\) 表示有多少 \(cnt_j = i\),即可在低于 \(O(n)\) 的复杂度内解决查询。
考虑怎么求这些东西。考虑建树,则这个东西相当于是每次给一个子树和 \([l,r]\),直接把子树变为 DFN 区间跑莫队是 \(O(n^{\frac{7}{4}})\) 的,考虑按照 CF 那个题的套路用树上启发式合并把子树改成一维限制,可以分析出复杂度不高于 \(O(n^{\frac{5}{3}}{(\log n)}^{\frac{1}{3}})\),据说可以通过。
67 U563110
直接套用 P9999 的 polylog 做法可以得到一个 \(O(n\sqrt n\log n)\) 的做法。
考虑单根号。
对于每个块维护 \([1,n]\) 每个点进入这个块时结果是什么。建立每个块的虚树,注意到在虚树上的边上的某个点,在操作过程中相当于若干个 \(+1\) 或 \(-1\),直到走到下一个虚树上的点,很容易就能做到 \(O(n\sqrt n)\) 了。
68 P11433
这是题吗?拼尽全力无法战胜。
注意到,每次加入一个点,枚举其所有邻边并找出任意一个包含其的三元环,找到的数量不小于 \(\lfloor \dfrac{2}{3}n\rfloor\)。
然后你按照随机顺序加点跑多几次,就过了,还跑得飞快?
69 云斗模拟赛 T1
范围太小了,先编一个与值域有关的 DP,每一段一起做。
然后把不在 \(a\) 中出现的数都变成一个状态,这样就随便通过了。
70 云斗模拟赛 T2
我们声称一个排列合法当且仅当对于任意 \(i \in [1,n]\),\(p_1,p_2,\cdots,p_i\) 中大于 \(i\) 的数不超过 \(k\) 个。
考虑原因是什么。
根据冒泡排序的相关套路,考虑按照每个 \(x\) 将序列每个数变为 \(0\) 和 \(1\),考虑一个 \(01\) 序列合法的充要条件。
第一轮的从前往后交换,就是对于每个 \(1\) 的连续段,把最后一个 \(1\) 移动到下一个连续段开头。发现如果忽略最后一个连续段,考虑前面每个连续段的长度,则可以仅视为第一个连续段长度减 \(1\),其他不变。
所以我们知道如果只有从前往后的冒泡,合法等价于对于任意 \(x\),将序列按照 \(\geq x\) 和 \(<x\) 划分为 \(0,1\),则除了末尾的一段 \(1\) 外,前面的 \(1\) 数量不超过 \(k\)。
而从后往前的冒泡本质上就是,把除了末尾段外的所有连续段向后移动一格。
所以每次执行从前往后和从后往前的冒泡等价于把第一个连续段的开头的数移动到最靠后的 \(0\) 位置上。
若除了末尾的段外前面的 \(1\) 数量不超过 \(k\),显然可行。否则考虑第 \(k+1\) 个 \(1\),则要求其之后有不超过 \(k\) 个 \(0\)。
考虑对于每个 \(x\),是 \(1\) 的数范围为 \([n-x+1,n]\),假设第 \(k+1\) 个 \(1\) 在 \(i\) 处,要求 \(n-x-(i-(k+1))\leq k\),即 \(i \geq n-x+1\)。也就是说,\([1,n-x]\) 中为 \(1\) 的数小于等于 \(k\) 个。
这显然等价于对于任意 \(i \in [1,n]\),\([1,i]\) 中大于 \(i\) 的数小于等于 \(k\) 个。这也等价于对于任意 \(i \in [1,n]\),\([1,i]\) 中 \(\leq i\) 的数大于等于 \(i-k\) 个。
考虑对这个 DP,记 \(f_{i,j}\) 表示目前考虑了 \([1,i]\),其中有 \(j\) 个数 \(\leq i\),且大于 \(i\) 的数目前没有具体钦定是多少的方案数。每次加入 \(i+1\) 时,分类讨论是否钦定 \(i+1\) 在 \([1,i]\) 中,以及 \(p_{i+1}\) 是否小于等于 \(i+1\)。总复杂度 \(O(n^2)\)。
71 云斗模拟赛 T3
数连通块数,考虑点边容斥。
但是每个连通块其实是一个团,所以考虑若 \([l_1,r_1],[l_2,r_2],\cdots,[l_k,r_k]\) 连通,\(l_1 < l_2 < \cdots < l_k\),则只在 \([l_i,r_i],[l_{i+1},r_{i+1}]\) 处计算贡献。
两个区间 \([l_1,r_1],[l_2,r_2]\) 等价时,若 \(l_2 > r_1+1\),则这个连通块仅包含这两个区间。记 \(b_i\) 为 \(a_i\) 的另一次出现位置,则要求 \(\max \limits_{i=l_1}^{r_1} b_i = r_2\) 且 \(\min \limits_{i=l_1}^{r_1} b_i=l_2\)。
如果是两个有交区间等价,则相当于是对称差的两部分等价。
依据这个写一个 \(O(n^2)\) 的东西,然后是可以简单 DS 优化到一个 \(\log\) 的。
72 P7916
首先可以直接转化为一个最小割模型。
考虑把外圈的黑白交界面拉出来,以及原网格图的界面拉出来,建一个对偶图。
相当于是我们要在这个对偶图中将外界面的这些点两两匹配选一条路径使得权值和最小。证明让我学一下。
可以看出匹配不会有相交关系,因为如果有可以替换,所以区间 DP 即可。
73 P11714
考虑一个非 SCC,其缩点后是一个至少有两个点的 DAG。
考虑 DAG 容斥手法,记 \(f_S\) 表示 \(S\) 内的保留若干条边使得图强连通方案,转移枚举出度为 \(0\) 的 SCC 构成的点集的子集,根据 \(\sum \limits_{T \subseteq S,T \neq \varnothing} (-1)^{|T|-1} = 1\) 做容斥。此外记录 \(g_{S,0/1}\) 表示保留 \(S\) 内的边使得 \(S\) 被划分为偶数或奇数个之间没有边的 SCC 的方案数。根据 \(g\) 算容斥系数即可,复杂度 \(O(3^n)\)。
74 ABC306Ex
如果没有等于号,相当于要把图定向使得其为 DAG,记 \(f_S\) 表示 \(S\) 内的点的答案,转移枚举出度为 \(0\) 的点集 \(T \subseteq S\),要求 \(T\) 是独立集,容斥系数是 \((-1)^{|T|-1}\)。
等于并不是什么很特别的,注意到等于本质就是把两边缩成一个点,要求最终得到的这个是 DAG,于是枚举缩点后的出度为 \(0\) 的点集 \(T\),则要求 \(T\) 中所有边都是等于,假设 \(T\) 有 \(c\) 个连通块,则容斥系数就是 \((-1)^{c-1}\)。
直接做就是 \(O(3^n)\),注意到形式是 \(f_S = \sum \limits_{T \neq \varnothing, T \subseteq S} (-1)^{h_T-1}f_{S \setminus T}\),按照 \(\mathrm{popcount}\) 枚举做子集卷积就可以做到 \(O(n^22^n)\),都可以通过。

浙公网安备 33010602011771号