11 月做题记录
1 P14363
问题等价于给若干字符串二元组,\(q\) 次询问每次给两个字符串,问有多少二元组使得第一个是询问的第一个的后缀,第二个是询问的第二个的前缀。建 Trie 等价于查询两棵 Trie 上到根路径交,变成 DFN 序后随便维护。
不保证 \(|t_1|=|t_2|\),神经病。
2 P14364
从前往后 DP。\(f_{i,j,k}\) 表示前缀 \([1,i]\),有 \(j\) 个位置爆了,还有 \(k\) 个位置钦定了 \(c>j\) 但还没有确定选什么数。当 \(j\) 增加 \(1\) 时尝试钦定若干位置值等于 \(j+1\) 即可。复杂度 \(O(n^3)\),原因是 \(\sum cnt_i = n\)。
没调出来,吐了。
3 P12726
总之你分治后记忆化就是 \(\sum k\) 乘以 \(\log n\) 的 \(O(1)\) 次方的,没啥脑子的题。
4 P11700
考虑只限制差分,则等价于某一列的和减去前一列开始最后一格开始的左上斜线内的和等于某值。所以 DP 中只需要记录之前每个还有用的斜线的和即可。精细分析一下状态和转移可知复杂度是 \(O(n2^kk!)\),理论上不太可能跑得满,所以应该是很快的。
5 P10071
我们声称如果 \(\forall i, 2 \mid cnt_i\),则答案为 \(\lfloor \dfrac{\sum cnt_i}{3}\rfloor\)。显然答案不超过其,而我们只需要每次任选三种长度并构造 \((a,b,b)\) 和 \((a,c,c)\),必定能达到这个值。
对于原问题,存在若干 \(2 \nmid cnt_i\),此时将其单独拉出来。然后每个位置还有 \(\lfloor \dfrac{cnt_i}{2} \rfloor\) 个两根棍子,其可以和之前的所有 \(2 \nmid cnt_i\) 的做一个二分图最大匹配状物。这个最大匹配形态很好,因为 \(i\) 的出边范围是 \([1,2i-1]\),所以直接线段树维护 Hall 定理即可。复杂度 \(O(n\log n)\)。
6 P10067
不难看出最终每个 \(i\) 的结果应该是前缀最大值和后缀最大值的较小值。
然后不难看出应该按照权值从小到大贪心。对于值域较大的问题常考虑整体操作,那么考察所有最小值变为次小值所需的花费。每一步让所有最小值 \(+1\),应该先操作最左和最右的,然后操作中间的。总而言之不难用数据结构维护之。
7 CF1656F
兄弟,这也太难了。
难以注意到 \(a_i\times a_j+t(a_i+a_j) = (a_i+t)(a_j+t)^2-t^2\)。所以 \(t\) 确定时,相当于 \(w_{i,j} = b_i\times b_j\) 的 MST,其中 \(b_i = (a_i+t)\)。
\(w_{i,j}=b_i \times b_j\) 的 MST 很好求,你考虑每个 \(i \in (1,n]\),若 \(b_i >0\) 则应该向 \(1\) 连边,否则应该向 \(n\) 连边。如果所有数全正或全负可能要特殊考虑一下。
对于原问题,不难看出在有上界的情况下最优的 \(t\) 为某个 \(-a_i\),然后计算 MST 的权值是不难的,推一下式子就行。
8 NFLS 模拟赛 T1
轮廓线 DP 板子。
9 NFLS 模拟赛 T2
XOR MST 板子。
10 NFLS 模拟赛 T3
令 \(a_{i,j}\) 表示点 \((i,j)\) 最早被覆盖时间。每次操作只需要选取范围内 \(a\) 的最大位置进行操作。
考虑如何求出 \(a\) 最大位置。考虑划分为横向和纵向的两类,以横向为例考虑如何计算答案。从下往上扫描线,对于每个纵向的竖线,在下方第一次进入时打一个标记,在上方离开时将其删去,相当于是范围内的区间 chkmax,线段树每个点挂一个队列即可维护这个结构。另一方面,对于若干 \(y\) 相同的横向线段,需要特殊考虑之,按照时间从小到达加入做区间 chkmax,操作后还要撤销回去。权值线段树不难维护这一点。
11 CF1633E
很套路的题。
注意到两条边权 \(w_1,w_2\) 的大小关系分界处为 \(x =\dfrac{w_1+w_2}{2}\),所以只有本值不同的 \(O(m^2)\) 种 MST,每种算一次预处理是 \(O(m^3 \log m)\) 的,询问不难做到 \(O(q \log q)\),据说能过。
12 CF1615F
此套路在不知道几场之前的梦熊模拟赛亦有记载。
将奇数位的权值 \(01\) 反转。注意到现在的操作变为了,每次交换相邻两个字符,问最少多少次达到目标。
记第一个串中 \(1\) 位置为 \(x_1<x_2<\cdots<x_k\),第二个串中 \(1\) 位置为 \(y_1<y_2<\cdots<y_k\),答案显然为 \(\sum \limits_{i=1}^k |x_i-y_i|\)。
枚举 \(x_i=a\),\(y_i=b\),计算第一个串 \([1,a)\) 前缀和第二个串前缀 \([1,b)\) 中 \(1\) 数量相等的方案数,后缀同理。即计算形如 \(\sum \limits_{i} \dbinom{n}{i} \dbinom{m}{i+k}\),\(n,m,k\) 确定,将 \(\dbinom{n}{i}\) 变为 \(\dbinom{n}{n-i}\) 套用范德蒙德卷积即可。复杂度 \(O(n^2)\)。
13 NFLS 模拟赛 T1
二分答案后不难贪心求解。求解过程不难维护所有颜色连续段。不过显然这个过程比较简单,不需要使用 set,而使用 vector 足以。复杂度 \(O(n \log V)\)。
14 NFLS 模拟赛 T2
Prufer 序列随机树高 \(O(\sqrt n)\),所以只需要能线性解决序列问题就能期望 \(O(n\sqrt n)\) 解决原问题。
对于序列问题,考虑每个位置对最后一个的贡献次数。不难发现一个非开头的数不重要,只需要截取后缀后与前缀做排列合并的组合数即可。即只需要计算 \(f_n\) 表示长度为 \(n\),所有排列中,\(a_1\) 对 \(a_n\) 的贡献次数和。这是 A000262。总复杂度 \(O(n\sqrt n)\)。
15 NFLS 模拟赛 T4
见过好多次了,呱呱。
16 AGC019D
可能算相对自然的题?
考虑整个过程最后一次 Flip 操作结束后的瞬间,\(A\) 肯定是 \(B\) 的一个循环移位。我们枚举这个移位的数量,就可以确定 \(A\) 的每个位置是否需要做 Flip。为了修改某些位的值,操作肯定是先向左若干位再向右若干位或相反。枚举向左多少位不难计算出向右还要移动多少位。问题解决,复杂度 \(O(n^2)\)。
17 AGC026E
记 \(f_i\) 表示 \([i,n]\) 中选配对的若干对的最大字符串。分类讨论 \(i\) 与其配对的那个位置选或不选。
不选,则从 \(f_{i+1}\) 转移。若选,考虑其配对的位置是 \(j>i\),分类讨论其是 AB 还是 BA。
若是 AB,则 \((i,j)\) 之间的都不选是优的。往后找到第一个离开这一段的位置从后面转移即可。
若是 BA,则 \((i,j)\) 之间有用的位置全都是 B,那就该全部选然后继续向后扩展。不断扩展直到变成一个极长连续段无法扩展时停止。
复杂度 \(O(n^2)\)。
18 AGC032C
显然 \(\forall i, 2 \mid deg_i\)。至此图存在欧拉回路。
如果一个点度数 \(\geq 6\),那么在这个位置至少可以将环拆成三部分,故直接判定为有解即可。
考虑每个点 \(deg_i=2\) 或 \(deg_i=4\) 的情况。如果所有点 \(deg_i=2\) 显然无解。现在考滤分类讨论 \(deg_i=4\) 的点的情况。
如果恰有一个点 \(deg_i=4\),则无论如何划分不出来三个环。
如果恰有两个点,则有解的形态唯一确定。不难手玩出来。
如果有至少三个点,不难看出必定有解。
19 AGC029E
考察 \(u\) 到 \(1\) 路径上每个点的不在路径上的子树内会被选几个点。显然不难将问题转化为,\(O(n)\) 次询问 \(v,x\),计算 \(v\) 子树内有多少点 \(z\) 满足 \(v\) 到 \(z\) 路径上最大编号不超过 \(x\)。
不难通过线段树合并维护,复杂度 \(O(n \log n)\)。
20 AGC045C
不错的性质观察题。
先考虑判定。将过程反过来。本质等价于,对于目前串 \(s\),选择一个长度 \(\geq a\) 的不含 \(1\) 的段,将段内的字符都变为 \(\texttt{?}\),或者选择一个长度 \(\geq b\) 的不含 \(0\) 的段,将段内的字符都变为 \(\texttt{?}\)。问最终是否可能得到全 \(\texttt{?}\) 的串。
注意到,\(a,b\) 的地位对等。不妨假设 \(a\leq b\)。若存在一个长度 \(=b\) 的全 \(1\) 子段则立即判定为合法。进一步,将所有 \(\geq a\) 的全 \(0\) 段变为 \(1\) 后,若存在一个长度 \(=b\) 的全 \(1\) 子段则判定为合法。不难说明这是充分必要的条件。
对于计数,考察问题的反面。不符合条件当且仅当将所有 \(<a\) 的 \(0\) 子段划分序列后每个段长度严格小于 \(b\)。至此已经不难 \(O(n^2)\) DP 了。
21 NFLS 模拟赛 T3
首先注意到存在最优解对于任意 \(i\) 都不同时选 \(2^i\) 和 \(-2^i\)。
考虑对于集合 \(S\),如果所有数都是偶数,将所有数除以 \(2\) 后递归进子问题。否则必然要选 \(1\) 或 \(-1\) 中恰好一个。直接爆搜选哪个。每次值域除以 \(2\),所以复杂度是对的。
22 P11587
考虑先二分答案,记二分值为 \(k\)。
判定问题可以看作二分图匹配问题。考虑霍尔定理,要求对于任意 \([l,r]\subseteq [L,R]\),有 \(\sum \limits_{i=l}^r a_i + \sum \limits_{i=l-1}^r b_i \geq (r-l+1)k\)。将其移项并将 \(l,r\) 拆开后,形式形如每个点有两种直线,询问 \(x=k\) 时判定区间内这些点值是否符合条件。
对原问题猫树分治,对于横跨 \(mid\) 且包含于 \([L,R]\) 的区间 \([l,r]\),考虑判定时选取区间 \([a,b]\) 的情况。若 \(b\leq mid\) 或 \(a > mid\),则可以视作 \([l,mid]\) 和 \((mid,r]\) 的后缀与前缀查询形式。这不难二分后李超树查询。对于 \(a \leq mid\) 且 \(b>mid\) 的情况,将李超树可持久化后做查询即可。
复杂度看起来是 \(O(n \log^3 n)\) 的,有人声称是 \(O(n \log^2 n)\) 的,我还没看明白。
23 P12703
对于询问 \(u,v\),找到一个叶子 \(x\),计算 \(x\) 到 \(u,v\) 的最短路和,取所有 \(x\) 的 \(\min\) 即为答案。
考虑对树边分治。每次断开一条边构成的两个连通块中,只有至多三条边横跨两个连通块。一条是树边,另外两条是叶子的环连边中的两条。将这三条边的至多 \(6\) 个 \(x\) 计算所有 \(u,v\) 属于整个连通块的答案,并将 \(u,v\) 同属于其中一个连通块的询问递归下去即可。复杂度 \(O(n \log^2 n)\)。
这么做的正确性可以归纳说明。对于目前的整个连通块,考虑询问 \(u,v\) 若属于断开边后的不同连通块,则必定要经过至多三条特殊边。若属于同一个连通块但是路径中到达了另一连通块,也需要走这三条边。若不经过另一连通块,递归进去计算即可。
24 炼石 NOIP R20T1
从小到大枚举最小值,每个集合维护一个指针表示大于等于最小值的最小值是多少。复杂度 \(O(m \log m)\)。
25 炼石 NOIP R20T2
这个题感觉是全场最难了。
不妨令 \(v_1,v_2,\cdots,v_k\) 为所有本值不同的 \(v\),且 \(v_1<v_2<\cdots<v_k\)。
此时,考察 \(m \bmod v_{2}=x\),若 \(x=0\),则你可以把 \(v=v_1\) 的所有物品从大到小排序后每 \(\dfrac{v_2}{v_1}\) 个分一组并将他们都丢到 \(v_2\) 里计算子问题。否则你应该先取 \(v=v_1\) 的价值前 \(x\) 大的物品,然后把剩下的分组向后扔。
复杂度 \(O(m \log m)\)。
26 炼石 NOIP R20T3
\(k\) 个的限制不难容斥,问题变为查询使用 \(1\) 到 \(n-1\) 凑出任意一个 \(x \leq n\) 的方案数。
这是典中典问题了。你考虑令阈值 \(B=\lfloor \sqrt{n}\rfloor\),\(\leq B\) 的直接背包计算是 \(O(nB)\) 的。大于 \(B\) 的部分,不难说明我们可以将任意一个方案对应到一个集合操作序列,每次向集合内加入 \(B+1\),或者将集合内所有数 \(+1\)。显然集合大小不超过 \(\dfrac{n}{B+1}\),所以 \(f_{i,j}\) 表示集合大小为 \(i\) 和为 \(j\) 的方案数。复杂度 \(O(\dfrac{n^2}{B})\),总复杂度 \(O(n \sqrt n + nk)\)。
27 炼石 NOIP R20T4
前几天才看过的题,写了写还挺好写的。
28 P11710
有趣。
考察最终选数的形态。我们先选定 \(1,3\) 和 \(3,1\),然后为每个区间选定一个 \(2\)。这样只要 \(1,3\) 和 \(3,1\) 选完了,问题相当于二分图是否有完美匹配,左侧是所有 \([l_i,r_i]\),右侧是所有 \(2\),每个左侧点连向区间范围内的所有 \(2\)。
考虑选的 \(1,3\) 和 \(3,1\) 形态,有一些事实。注意到相交不劣于包含,所以假设选了 \(x\) 个 \(1,3\) 和 \(y\) 个 \(3,1\),应该是最靠前的 \(x\) 个 \(1\) 和靠后的 \(x\) 个 \(3\) 一一匹配,最靠前的 \(y\) 个 \(3\) 和最靠后的 \(y\) 个 \(1\) 一一匹配。
对于二分图匹配,考虑 Hall 定理,要求每个左侧区间子集对应的右侧被包含于任意一个区间内的 \(2\) 数量不小于子集大小。显然只需要判定右侧的邻点是一个区间的情况。即有完美匹配当且仅当对于任意区间 \([l,r]\),其中 \(2\) 的个数不小于包含于 \([l,r]\) 的左侧区间个数。
枚举 \([l,r]\),限制形如 \(\max(0,x-a)+\max(0,y-b)\leq c\),然后就不难求出最优的 \(x,y\) 了。复杂度 \(O(n^2)\)。构造答案时,将区间按右端点排序贪心选取即可。
29 CF1887E
将点 \((x,y)\) 视作二分图左侧第 \(x\) 个点向右侧第 \(y\) 个点连边,边权为颜色。目标找到互不同色的四元环。
由于给了 \(2n\) 条边,必定有环。随便找到一个环,每次递归从中间加边就可以使环长大约减小一半。操作次数 \(O(\log n)\)。
30 CF1879E
注意到答案不超过 \(3\),\(3\) 的构造很简单。判定答案是否是 \(1,2\) 不难进行一堆分类讨论了。
31 CF1839E
我们声称后手必胜当且仅当原序列存在一个子序列满足子序列内的和等于整个序列总和的一半。
显然这是充分的,因为任意时刻无论先手如何操作,后手操作另一个子序列的任意一个数。两个子序列减小量总相同,所以最后先手必败。
反之,先手每次任意操作一个数,后手操作后必定仍然不存在一个子序列和为整体的一半。这是因为你考虑若存在,容易反证本来也存在。
背包即可。
32 CF1781G
鬼题。
我们猜测答案是 \(n \bmod 2\),但是样例都过不去。这时不知道为什么有人能注意到样例是唯一的反例。
我们尝试归纳说明并给出构造。\(n\leq 8\) 时,通过爆搜,不难说明必有解。
对于一般的 \(n\),只要我们能将二叉树划分为若干大小为 \(2\) 或 \(3\) 的连通块,则自然能构造出 \(n \bmod 2\),原因是 \(2\mid n\) 时大小为 \(3\) 的连通块有偶数个可以直接构造,\(2 \nmid n\) 时有奇数个自然能取到下界。
我们接下来说明,对于 \(n>8\),总存在将树划分成若干大小为 \(2\) 或 \(3\) 的连通块的方法。
若存在点 \(u\),满足其两个儿子都是叶子,则划分出了一个大小为 \(3\) 的连通块。另一方面,若存在点 \(u\) 满足其只有一个儿子且其为叶子,则划分出了一个大小为 \(2\) 的连通块。这都可以归纳进子问题。我们声称上述情况之一必然成立。据此,我们也进行归纳。\(2 \leq n \leq 3\) 时显然。\(n>3\) 时,任取一个叶子,考虑其父亲,则当且仅当父亲有另一个儿子且儿子子树至少为 \(2\) 时这个点不能选为构造。而根据归纳假设这个儿子子树至少为 \(2\) 所以必然有解。据此不难构造。
33 CF1758F
这个题感觉不是很难。
分类讨论操作:
- \(1\) 变 \(0\)。考虑本来包含 \(i\) 这个位置的区间 \([l,r]\)。令 \(1\) 权值为 \(1\),\(0\) 权值为 \(-1\),\(s(l,r)\) 表示 \([l,r]\) 区间权值和。则本来有 \(s(l,r)=0\),所以 \(s(l,i-1)+s(i+1,r)=-1\)。所以 \(s(l,i-1)\) 和 \(s(i+1,r)\) 中总有一个是负数。不妨令其为 \(s(l,i-1)\),则找到第一个位置 \(x \leq i - 1\) 满足 \(s(l,x)=-1\),显然 \(S_x=0\),将 \([l,x)\) 划分出来。此时 \(s(x+1,r)=1\),故 \(s(x+1,i-1)+s(i+1,r)=0\)。若两者都为 \(0\) 则直接划分,否则一侧有负数同理找到第一个前缀和为 \(-1\) 的位置划分,那么剩下这一段本来的和就是 \(2\),将 \(1\) 变为 \(0\) 后和正好变为 \(0\),恰好符合限制。
- \(0\) 变 \(1\)。若本来这个 \(0\) 在某段内,则变为 \(1\) 后段的总和从 \(0\) 变为了 \(2\)。此时考虑右端点的下一个字符,若是 \(0\) 则可将其纳入段内,否则将这段与原段合并。不断往后做即可。另一方面,若本来 \(0\) 不在段内,若下一个字符也是 \(0\),操作后 \(10\) 就是合法段,否则类似之前的继续往后合并段即可。
整个过程不难用线段树维护。复杂度 \(O(n \log n)\)。操作次数线性。
34 CF1700E
限制等价于对于每个点,其四连通邻居中存在比其小的。
找到所有不符合位置的点,如果太多必然无解。否则枚举常数种交换方法判定即可。复杂度 \(O(nm)\)。
35 CF1559D2
显然以任意顺序每次添加一条合法的 \((u,v)\) 直到无法添加任意边位置,不难证明任意这样的顺序总能得到最优解。至此已经不难得到一个多项式复杂度算法了。
一个没有思维含量的做法是直接 Boruvka,复杂度不高于 \(O(n \log^2 n)\),应该是足以通过的了。不过显得比较蠢。
实则有一个聪明的做法。考虑先令 \(u=1\) 尝试添加所有 \((1,v)\),操作后可以发现对于任意 \(x\),不可能同时有 \(x\) 在 \(G_1,G_2\) 中均不与 \(x\) 连通,否则可以添加边 \((1,x)\)。手玩一下可以看出现在只需要把 \(G_1,G_2\) 中不包含 \(1\) 的连通块拉出来,把数量小的依次与数量大的合并即可。复杂度 \(O(n\alpha(n))\)。
36 CF1526E
将排序后相邻两个后缀拉出来,根据下一位后缀的大小关系可以确定对应的两位之间是 \(\leq\) 还是 \(<\),据此得到一条长度为 \(n\) 的链,相邻两个位置关系是 \(\leq\) 或 \(<\)。枚举其中有多少 \(\leq\) 确实取等了即可。复杂度线性。
37 P7447
考虑倍增值域分块,即取值 \(B\),将所有 \([B^i,B^{i+1})\) 分为一块。每块维护一棵线段树。每次操作减 \(x\) 时,找到 \(x\) 所在块为 \(y\),大于 \(y\) 的块做区间减 \(x\),并将更改块的数暴力移动到新的块。小于 \(y\) 的块则不变。对于 \(y\) 这块内的数,找到所有大于 \(x\) 的位置暴力减去 \(x\) 并尝试移动到新的块。具体地线段树上维护最值即可进行这个操作。我们声称这么做的复杂度是 \(O(nB\log_B V\log n)\)。取 \(B=O(1)\) 复杂度为 \(O(n\log n \log V)\)。
这个复杂度正确的原因在于,任意一个数只会被向下进入不同的块 \(O(\log_B V)\) 次。另一方面,复杂度瓶颈还在于对于 \(y\) 块内的所有大于 \(x\) 的数暴力减 \(x\)。考虑 \(y\) 的块对应值域 \([B^k,B^{k+1})\),显然 \(x \geq B^k\),对于任一 \(z \in [B^k,B^{k+1})\),其至多减去 \(B\) 次 \(x\) 就会进入新的块,所以这么操作的总次数是 \(O(B\log_B V)\) 的。总复杂度即为 \(O(nB\log_B V\log n)\)。
空间复杂度是 \(O(n\log_B V)\) 的,不太能过。考虑底层分块。这个做法大概是说,忽略原序列的空间开销,我们可以将一棵线段树的空间从 \(O(n)\) 变成 \(O(\dfrac{n}{\log n})\)。具体地,以 \(B=O(\log n)\) 分块,对 \(O(\dfrac{n}{B})\) 该块维护线段树,叶子节点信息维护整个块的信息并。对于修改查询操作,整块在线段树上进行,散块在原序列上进行。这样时间复杂度是 \(O(\dfrac{n}{\log n}\log^2 n)=O(n \log n)\) 的,空间是 \(O(\dfrac{n}{\log n})\) 的。这个题中,倍增值域分块的 \(O(\log_B V)\) 棵线段树可以共用原序列,查询单点时在线段树上查询其对应权值即可。这样空间被降低到 \(O(\dfrac{n\log V}{\log n})\),时间保持不变。如果以 \(B=O(\log V)\) 做底层分块可以做到线性空间与 \(O(n\log^2 V)\) 时间。
38 CF925E
考虑令 \(a_i\) 为 \(0\) 代表未休假,\(a_i=1\) 代表休假。对于点 \(i\),若 \(-\infty \times a_i + \sum \limits_{j} a_j - t_i > 0\) 说明其不合法,其中 \(j\) 在 \(i\) 子树内。令 \(b_i\) 为此值。相当于支持到根路径 \(b\) 加减 \(1\),全局查询正数数量。这是经典的不能 polylog 问题,考虑根号做法。我们将树重链剖分后拆成 \(O(\log n)\) 个序列区间,序列问题不难分块做到 \(O(n\sqrt n)\),所以总复杂度 \(O(n\sqrt n\log n)\)。
但是你先别急,可以做到 \(O(n\sqrt n)\)。具体地,树链剖分若用线段树维护,则一般做法都是全局开一棵线段树然后做区间查询,不过由于你的查询都是重链上的信息,也可以单独对每条重链建立线段树进行查询。若用线段树维护,复杂度并不会变优。而若是分块,事实上对每条重链单独以不同块长分块能做到更优的复杂度。是这样。考虑到对于任意一棵树的某条重链,其长度不会超过链顶对应节点的子树大小。而到根路径拆成重链,从上往下第 \(i\) 条的长度不会超过 \(O(\dfrac{n}{2^{i-1}})\),这是因为每一次切换轻边子树大小至少除以 \(2\)。对长度为 \(l\) 的链以 \(B=O(\sqrt l)\) 分块,单次操作复杂度应该是 \(O(\sum \limits_{i} \sqrt{\dfrac{n}{2^{i-1}}})=O(\sum \limits_{i} \sqrt{\dfrac{n}{2^{i}}})=O(\sqrt n)\)。至此,我们得到了 \(O(n\sqrt n)\) 的做法。
39 CF1528D
其实没那么难,唉。
考虑对于固定的起点 \(x\),记 \(f_i\) 为从 \(x\) 到 \(i\) 的最短时间。每次取出 \(f_i\) 最小的 \(i\),并以 \(s=f_i\) 更新所有后继。以及,若 \(i\neq x\),尝试更新 \(i\rightarrow (i+1)\bmod n\),边权为 \(1\)。显然得到了最短路,复杂度 \(O(n^3)\)。
40 AGC027D
相邻两个格子的限制不难想到黑白染色。对于黑格先钦定其权值,对于白格其权值为四周的 \(\mathrm{lcm}\) 加上 \(1\)。为了保证数两两不同直接的做法是令黑格依次从小到大取质数,然而这样会超过 \(10^{15}\) 的限制。考虑给每条对角线赋一个质数权值,每个黑点的权值为这个点对应两条对角线的权值乘积,这样只需要 \(O(n)\) 个质数,每个点的权值为四个质数乘积量级,足以通过。
41 NFLS 模拟赛 T1
按照边权从大到小贪心。对于目前枚举的最大边,将所有小于其的边先加入,考察树上的所有连通块大小。若不存在严格大于一半的数,答案就是 \((n-1)w\),否则递归进入最大的连通块计算答案即可。
42 NFLS 模拟赛 T2
李超树板子。空间被卡常了。
43 NFLS 模拟赛 T3
性质观察题,赛时想得不太明白。
由于每行都有 \(1\),每列都有 \(0\),所以 \(1\) 和 \(0\) 不可能同时为连通块。不妨假设 \(1\) 不连通,注意到 \(1\) 的形态肯定是一个倒三角和一个正三角拼接状物。枚举 \(i,j,k\) 表示倒三角最右下的点在 \((i,j)\),正三角最左上的点在 \((i+1,k)\),计数可以看作网格上路径计数,直接组合数计算即可。直接做是 \(O(n^3)\) 的,不难看出 \(j,k\) 相对独立,从而优化到 \(O(n^2)\)。
44 NFLS 模拟赛 T4
没那么难,但是思路值得回味。
我们对序列每 \(k\) 个分一块,注意到每个长度为 \(k\) 的区间均可以表示为相邻两块一个后缀和一个前缀拼接的形式。对于每个块存在一个交界点,使得当 \(l\) 在交界点或之前时,这段后缀比下一块的前缀最大值更大,之后则更小。我们尝试维护每一块的界点,并同时维护每一块的答案。
修改时,不难注意到只有左右共 \(O(1)\) 个块的界点会变,对这些块重新求界点即可。二分后线段树是 \(O(\log^2 n)\) 的,把区间变成线段树节点应该可以做到 \(O(\log n)\)。这 \(O(1)\) 个块重算界点后同时重算答案。对于中间界点不变的块,所做的只是答案增量。这样直接维护就行。
查询同理。中间的部分直接查询,左右 \(O(1)\) 个块需要单独处理,通过一些分类讨论不难算出。
45 AGC031D
魔怔题。
不难注意到 \(f(p,q)=q\circ p^{-1}\),故 \(a_{n+2}=a_{n+1}\circ a_n^{-1}\)。
考虑列出前若干项:
令 \(h=qp^{-1}q^{-1}p\),注意到 \(a_n = ha_{n-6}h^{-1}\),问题转化为计算 \(h^x\),快速幂即可。复杂度 \(O(n \log k)\)。
46 AGC032D
考虑一个集合 \(S\) 使得 \(S\) 内元素的相对大小不发生变化,则对于任意一个不属于 \(S\) 内的数,若其左侧最大的 \(S\) 内的数比其大,则需要 \(B\) 的代价向右移动过去,若比其小则需要 \(A\) 的代价向左移动。\(f_{i,j}\) 表示前 \(i\) 个数,\(S\) 内的最后一个数为 \(j\) 的答案即可。复杂度 \(O(n^2)\)。
47 AGC018D
哈密顿回路大家都会做,每条边至多经过 \(2\min(sz_1,sz_2)\) 次,以重心为根不难构造。
对于哈密顿路径是类似的,先考虑一个简单情况。如果树有两个重心,则之间的连边显然只能被经过至多 \(n-1\) 次。并且确实可以取到且其他边依然取满。另一方面,若只有一个重心,考虑在哈密顿回路上删去某条最小边。根据限制我们只能在重心的不同子树内走,所以最优方案应该是找到重心的最小邻边删去,显然可以取到。复杂度线性。
48 AGC026D
大概是说第一列确定后,第二列的信息几乎已经确定,除非第一列下面这部分是 \(01\) 交替的。
这个应该不太难 DP。\(f_{i,j}\) 表示前 \(i\) 列,第 \(i\) 列第一个相邻同色的位置在 \(j\) 的方案数。复杂度虽然看似 \(O(nh)\) 但是看起来不难通过一些离散化状结构快速维护 DP。
49 AGC014D
后手必胜等价于树存在完美匹配。
50 AGC040C
又是这个 Trick,考虑将奇数位的字符翻转,\(\texttt{A} \rightarrow \texttt{B}\),\(\texttt{B} \rightarrow \texttt{A}\),\(\texttt{C} \rightarrow \texttt{C}\)。现在限制是不能删去相邻的 \(\texttt{AA}\) 和 \(\texttt{BB}\)。合法当且仅当 \(\texttt{A}\) 和 \(\texttt{B}\) 的出现次数均不超过 \(\dfrac{n}{2}\)。
这个直接容斥,枚举出现次数 \(i > \dfrac{n}{2}\) 计算即可。复杂度线性。
51 ARC050D
考虑排序后相邻两个后缀,必然有 \(s_{p_i}+s_{p_{i+1}} \leq s_{p_{i+1}} + s_{p_i}\),否则可以交换相邻的两个字符串。
对于任意 \(i,j\),我们比较 \(i,j\) 使用 \(s_i+s_j < s_j+s_i\),只要能证明这个是全序即可。至于如何比较 \(i,j\),不难建后缀数组后求 LCP 在 \(O(1)\) 的复杂度内进行比较。
考虑为什么这个是全序关系。由于 \(|s_i+s_j|=|s_j+s_i|\),所以比较字典序等价于比较数字大小,令 \(x_i\) 为 \(s_i\) 对应十进制结果,则等价于 \(x_i10^{|x_j|}+x_j < x_j10^{|x_i|}+x_i\)。移项后等价于 \(\dfrac{x_i}{10^{|x_i|}-1} < \dfrac{x_j}{10^{|x_j|}-1}\),故为全序。总复杂度 \(O(n \log n)\)。
52 P11405
令 \(f_i\) 表示前 \(i\) 个的答案,\(\mathrm{submax}(i,j) = \max \limits_{x=i}^j s_x\)。则 \(f_i = \min \limits_{j \geq i - k + 1} \{ f_{j-1} + \mathrm{submax}(j,i)\}\)。
直接利用线段树和单调栈不难做到 \(O(n \log n)\),估计是过不了的。
考虑决策点 \(j\),必定有 \(j=i-k+1\) 或 \(s_{j-1}\) 为 \([j-1,i]\) 的严格后缀最大值,否则令决策点为 \(j-1\) 显然不劣。
维护后缀最大值的位置然后维护一个能支持插入删除查询最小值的 multiset 也可以做到 \(O(n \log n)\),利用懒惰删除优先队列就可以得到一个常数非常小的做法,据说可以通过。
进一步,分析 \(i \gets i+1\) 的本质,是把后缀最大值这个序列末尾删除一些数,然后末尾加入,以及将 \(j<i-k+1\) 的 \(j\) 弹出。即你需要维护一个序列,支持末尾加入删除,开头删除,查询全局最小值,利用双栈模拟队列的结构即可做到线性。
53 P11598
\(f_{i,j}\) 表示第 \(i\) 列最终值为 \(j\),前 \(i\) 列的最小答案。
转移是 \(f_{i,j} = \min \limits_{x \in [i-H,i+H]} f_{i-1,x}\),然后 \(f_{i,j} \gets f_{i,j} + |S_i-j|\)。
不难归纳证明 \(f_{i,j}\) 在 \(i\) 确定时关于 \(j\) 是凸的。进一步考察转移过程,对于 \(f_{i-1}\),有一个谷底 \([l,r]\),在 \(i\) 时会扩展到 \([l-H,r+H]\),然后剩下的部分向左右移动 \(H\)。最后加上一个凸函数 \(g(x)=|x-S_i|\)。那么直接维护所有拐点集合即可。复杂度 \(O(n \log n)\)。
54 P11620
对原序列做异或差分,不难证明 \(a_l,a_{l+1},\cdots,a_r\) 的异或线性基等于 \(a_l,a_{l+1}\oplus a_l, a_{l+2}\oplus a_{l+1},\cdots,a_r\oplus a_{r-1}\) 的异或线性基。
线段树维护之,每个点维护区间线性基,合并的复杂度是 \(O(\log^2 V)\),总复杂度 \(O(n\log n\log^2 V)\)。
55 P11608
肯定是按照 \(a\) 从小到大排序后依次选取。记 \(f_{i,j}\) 表示前 \(i\) 个物品选了 \(j\) 次的答案,转移有 \(f_{i,j} = \max(f_{i-1,j},f_{i-1,j-1}+b_i+a_i(j-1))\)。
对于取 \(\max\) 的转移,猜测存在一个分界点 \(x\) 使得 $\forall j \leq x $ 有 \(f_{i-1,j} \geq f_{i-1,j-1}+b_i+a_i(j-1)\),\(\forall j> x\) 有 \(f_{i-1,j} < f_{i-1,j-1}+b_i+a_i(j-1)\)。平衡树维护每个 \(j\) 的答案,在上面二分即可。
56 P11286
插入标记回收板子。
由于只有 \(\pm 1\) 的增量,你都不需要写平衡树有交合并,直接合并就行了。
57 P11307
无聊的 Boruvka 板子题。
线段树维护最小值以及与最小值颜色不同的次小值即可。
58 P11317
\(u\) 固定时答案就是前 \(k\) 条长链的和。每次换根只会更改 \(O(1)\) 条长链,然后咋维护都行。
59 P14468
链的情况,考虑线段树,每个点维护对应区间内左侧之前的和为 \(s_1 \in [-2,2]\),最终和为 \(s_2 \in [-2,2]\) 的答案。合并是简单的。
对此上个重链剖分应该就行了。当然你可以将其本质理解为 DDP。
60 P14470
问题是公平组合游戏,考虑计算 SG 函数。注意到任意时刻每个序列对应原序列的一个区间,所以记 \(f_{l,r}\) 表示区间 \([l,r]\) 的 SG 函数,每次枚举删除的数 \(x\) 并由此将 \([l,r]\) 划分为若干子区间,计算子区间游戏的 SG 函数的 \(\mathrm{XOR}\),并所有 \(x\) 求结果的 \(\mathrm{MEX}\) 即可。至此不难得到一个关于 \(n\) 的多项式复杂度算法。
考察计算 SG 函数的递归形式,可以发现在递归计算时,有大量 \([l,r]\) 区间满足 \(a_{l-1}=a_{r+1}\) 且 \(a_{l-1}\) 没有出现过在 \([l,r]\) 的任何位置。这种区间显然只有 \(O(n)\) 个。如果能计算出这些区间的答案,那么我们猜测原问题也能得以更高效地计算。
实际上并非如此。就算能计算上述 \(O(n)\) 种区间,我们考虑要计算任意区间 \([l,r]\) 时,枚举 \(x\) 并划分开成子区间的问题中,尽管中间的大部分区间都是这样的区间,但是考虑区间内第一个 \(x\) 的位置 \(i\),则你发现 \([l,i)\) 并非一个这样的区间,同理最后一个位置加 \(1\) 到 \(r\) 的这段后缀也没有得以预先计算。考虑这样区间的形态,不难发现 \(i\) 是 \([l,n]\) 中 \(a_i\) 的首次出现位置。故我们考虑将形如这样的区间也预先计算答案,即对于每个 \(i\),之前和之后每种数第一次出现位置之前的答案。这样的区间总共有 \(O(nV)\) 个。如果能预先计算这些答案,就能求解任意区间的答案。而计算这样的区间答案只需要按照区间右端点从小到大按照同样方法计算即可。对于区间异或问题,由于按照右端点从小到大计算了,所以实则可以 \(O(1)\) 计算区间异或,这样复杂度应该是 \(O(nV^2)\) 的。
61 P6831
注意到对于 \(x_1,x_2,\cdots,x_n\),获得的代价是 \(\sum \limits_{i=\frac{n}{2}+1}^n x_i - \sum \limits_{i=1}^{\frac{n}{2}} x_i\)。这同时也是在 \(n\) 个数中选 \(\dfrac{n}{2}\) 个取 \(+1\),另 \(\dfrac{n}{2}\) 个取 \(-1\) 所能获得的最大收益。
在原问题中,只需要在 \(nk\) 个数中选 \(\dfrac{nk}{2}\) 个数取 \(+1\) 其他取 \(-1\) 就能对应一个方案,因为你任意取出 \(+1\) 和 \(-1\) 各 \(\dfrac{n}{2}\) 个拼一起,如果不是最大的 \(\dfrac{n}{2}\) 个取到 \(+1\) 的贡献那这就不是最优解了。
故原问题不难解决,排序后先认定每个取最小的 \(k\) 个均为 \(-1\),每次调整一个 \(-1\) 变为 \(+1\),优先队列维护所有增量即可。
62 炼石 NOIP R22T1
随便贪心就行。
63 炼石 NOIP R22T2
注意到一个图合法当且仅当只保留边权为 \(0\) 的边时每个连通块是一棵树,且边权为 \(1\) 的边都在连通块之间。
故对白连通块 DP。\(f_S\) 表示 \(S\) 这个点集的答案,转移枚举白连通块子集 \(T \subseteq S\) 即可。复杂度 \(O(3^n)\)。
64 炼石 NOIP R22T3
看起来应该是枚举一个 \(p_1,p_2,\cdots,p_n\),然后依次经过所有点并计算答案。但实际上你这么写状压 DP 会获得 \(74\) 分,在小数据会挂。考察其原因,你发现在最短路走的过程中有可能将本质相同的方案由于 \(p\) 的顺序原因而被计算多次。
令 \(d_{a,b}\) 表示两点距离。考虑这个过程的本质,考虑任意时刻我们有一个集合 \(S\) 表示已经经过的点以及目前所在的位置 \(x \in S\),在向后转移的时候,我们枚举下一次要到的点 \(y \notin S\),要求 \(y\) 是下一次第一次经过的集合外的点,然后 \(S \gets S \cup \{y\}\)。故我们希望记 \(g_{S,a,b}\) 表示从 \(a\) 走到 \(b\) 且不经过 \(\bar S\) 内的任意一个其他点的方案数。枚举第一个经过的 \(k \in \bar S\) 使得 \(d_{a,k}+d_{k,b}=d_{a,b}\),然后 \(g_{S,a,b} \gets g_{S,a,b}-g_{S,a,k}\times f_{k,b}\)。\(f\) 表示两点之间最短路方案数,是一个简单多重组合数,可以直接预处理。处理完 \(g\) 后直接 DP,\(f_{S,x}\) 表示目前集合为 \(S\),最后一个点为 \(x \in S\) 即可。复杂度 \(O(2^mm^3)\)。
65 炼石 NOIP R22T4
很简单的题,只是很难写罢了。
你考虑到上升段数量是 \(\sum \dfrac{c_i(c_i+1)}{2}\),所以先把连续段拉出来,然后一个点被覆盖为一个新的值产生的贡献是 \(O(1)\) 段分段的常数,然后对 \(x\) 扫描线对于每个 \(y\) 维护交换 \(p_x,p_y\) 答案就行。
66 NFLS 模拟赛 T1
枚举最远到的位置,然后肯定按照 \(c\) 从大到小贪心选,线段树维护之即可。
67 NFLS 模拟赛 T2
先考虑 \(\exist i, m_i \geq 2\)。这时相邻距离 \(d\) 唯一确定,此时考虑对于每个 \(i\),令 \(a_i\) 为第一个节点到开头距离,\(b_i\) 为最后一个节点到末尾距离。对于每个 \(i\),连边 \(a_i \rightarrow d-b_i\),对图跑欧拉路径即可。
对于所有 \(m_i=1\) 的情况,问题等价于是否存在排列 \(p_1,p_2,\cdots,p_n\),使得 \(\forall 1 \leq i < n, b_{p_i}+a_{p_{i+1}} = b_{p_1}+a_{p_2}\)。
你考虑最大的 \(b_i\) 若不为 \(p_n\),则必和某个 \(a\) 匹配。显然 \(a\) 只能是前两小的,因为若不是,则存在一个更小的 \(b\) 和更小的 \(a\) 匹配得到一个严格小于这个 \(b\) 的结果,这样就不对了。这样你只需要考虑最大的两个 \(b\) 和最小的两个 \(a\) 相加得到的 \(d\),只要考虑 \(O(1)\) 个 \(d\),然后跑上述做法即可。
68 NFLS 模拟赛 T3
还有人不会 baka's trick 吗。
69 NFLS 模拟赛 T4
题意显然在说 Hall 定理,考虑右侧是若干区间并,左侧是包含于任意一个右侧区间的所有区间。现在你考虑对于固定的 \(x\),每个右侧区间 \([l,r]\) 对应的左侧区间集是怎么样的。显然要对 \(x \in [l,r]\) 是否成立分类讨论。若 \(x \notin [l,r]\),则对应左侧是所有包含于 \([l,r]\) 的 \(t=0\) 的区间,否则 \(x\in [l,r]\),左侧是包含于 \([l,r]\) 的任意区间。
对此不难处理出 \(f_i\) 和 \(g_i\) 表示在 \([1,i]\) 和 \([i,n]\) 选若干不交区间对应的所有 \(t=0\) 的贡献最大值。中间分类讨论 \(x\) 是否被选在不交区间内,若不在则是 \(f_{x-1}+g_{x+1}\),否则是 \(\max \limits_{x \in [l,r]} \{f_{l-1}+g_{r+1}+w_{l,r} \}\),这个也不难扫描线维护历史最值做。复杂度 \(O(n \log n)\)。
70 CF725F
贪心好题。
考虑如果每堆只有一张,则应该按照 \(a+b\) 从大到小贪心选择,现在每堆有两张。
对于满足 \(a_1+b_1 \geq a_2+b_2\) 的某堆,我们可以忽略先取上面再取下面的限制。对于这样的堆,将 \((a_1,b_1),(a_2,b_2)\) 加入序列中按 \(a+b\) 从大到小依次选取即可。现在我们考虑 \(a_1+b_1 < a_2+b_2\) 的堆。
对于这样一堆,移项得 \(a_1-b_2 < a_2-b_1\),若 \(a_1 > b_2\),则后手不愿意操作这一堆,故无论如何贡献都是 \(a_1-b_2\)。若 \(a_2 < b_1\),先手不愿意操作这一堆,故无论如何贡献都是 \(a_2-b_1\)。否则有 \(a_1 \leq b_2\) 且 \(b_1 \leq a_2\),双方都不希望取这一堆,故直接视为不存在即可。
时间复杂度 \(O(n \log n)\)。
71 ARC076D
注意到问题等价于左侧每个点向右侧区间 \([l,r]\) 补集连边求二分图最大匹配,左侧点数减最大匹配即为答案。这个套用 Hall 定理直接做即可。
72 CF2119E
令 \(c\) 为最终的 \(b\) 序列。对于每一位考虑。对于 \(a_i=1\) 的位置,要求 \(c_i=c_{i+1}=1\)。而某些其余 \(0\) 的位置为了要求 \(c_i \geq b_i\),需要把某些本不限制为 \(1\) 的位置要求 \(c_i=1\)。显然对于每个 \(i\),显然只需要极小的比 \(b_i\) 大的,总而言之每个 \(c_i\) 只有 \(O(\log V)\) 种可能的最优取值,对此直接 DP,复杂度 \(O(n \log^2 V)\)。
73 CF505E
先二分,问题是怎么判定。
对于原问题进行贪心看似相当困难,考虑将操作倒序。二分值为 \(x\),则初始有 \(b_1=b_2=\cdots=b_n=x\),每次先将所有 \(b_i \gets b_i-a_i\),要求任意时刻 \(b_i\) 非负,然后选定至多 \(k\) 个进行 \(b_i \gets b_i+p\),要求最终 \(b_i \geq h_i\)。这就很好贪心了。考虑按照每个人操作到负数的最短时间从小到大操作 \(k\) 次,如果所有位置都在规定时间内严格非负,则计算每个位置至少多少次加操作才能使最终值 \(\geq h_i\),求和后判定即可。复杂度 \(O((n+mk)\log n\log V)\)。
74 CF1572D
神秘题。
注意到 \(i,j\) 有边当且仅当 \(\mathrm{popcount}(i \oplus j) = 1\),故 \(\mathrm{popcount}(i)\) 与 \(\mathrm{popcount}(j)\) 奇偶性必然不同,问题转化为 \(O(2^n)\) 个点 \(O(n2^n)\) 条边的最大权二分图匹配。
注意到每选一条边,至多使得 \(2n-2\) 条边不能再选,故只需要保留前 \(2nk\) 大条边跑最大费用流即可。这样点数边数都是 \(O(nk)\),怎么跑都能过。
75 NFLS 模拟赛 T1
下标从 \(0\) 到 \(2n-1\) 模 \(m\) 分类后容斥即可。复杂度 \(O(n^2)\)。
76 NFLS 模拟赛 T2
不难做到 \(O(qd^2\log n)\),\(d\) 是路径点数最大值。\(\log\) 瓶颈在于树状数组所以跑得飞快。
77 NFLS 模拟赛 T3
不妨假设要求 \(i\leq \dfrac{n}{2}\) 的答案,不难注意到只有两种有用的解:
- 只选 \(n\)。
- 选 \(1\) 和 \([2i-1,n]\)。
对此不难将问题转化为二维数点,复杂度 \(O(n \log n)\)。
78 NFLS 模拟赛 T4
对于集合 \(S\) 不难求出其后继。具体来说将最小的 \(0\) 位变为 \(1\),然后之前都赋回 \(0\),将与其后的 \(\gcd\) 加入即可。
然后分块打表就行。
79 P5912
问题等价于你要找一棵深度最小的点分树。显然答案不超过 \(O(\log n)\)。
进一步,其本质是,给每个点一个标号 \(d_u\),要求对任意 \(d_u = d_v\) 且 \(u \neq v\),存在 \(u\) 到 \(v\) 路径上某个点 \(w\) 满足 \(d_w > d_u\)。
考虑从叶子向上贪心。对于每个点 \(u\),考察子树合并的过程。如果两侧子树内都存在一个标号为 \(x\) 的点满足其到两边的根路径上的所有标号均 \(\leq x\),那么限制 \(d_u > x\)。由于答案不超过 \(O(\log n)\) 所以你可以将满足条件的 \(x\) 状压下来,贪心选取最小的符合条件的 \(d_u\) 即可。复杂度 \(O(n \log n)\)。
80 CF1572C
考察任意一个序列最终合并成什么颜色,我们声称存在最优解使得最终颜色为 \(n\) 点原颜色。如果 \(n\) 点被染成了新颜色,那你把这次操作对应区间之前先染成任意颜色然后再染成 \(n\) 点颜色即可。
故考虑记 \(f_{l,r}\) 表示区间 \([l,r]\) 都合并成 \(a_r\) 能节约的最大数量。转移形如 \(f_{l,r}=\max(f_{l,r-1},\max \limits_{a_k=a_r} \{f_{l,k}+f_{k+1,r-1}+1\})\)。复杂度 \(O(dn^2)\),其中 \(d\) 为每种颜色出现次数最大值。
81 CF325E
注意到 \(2 \nmid n\) 时无解,考虑 \(2 \mid n\) 怎么做。
注意到 \(i\) 和 \((i+\dfrac{n}{2})\bmod n\) 的出边相同,所以对于任意 \(i\) 和 \((i+\dfrac{n}{2})\bmod n\),显然是在出边中各取一个。先随便取,不难发现此时得到了一个排列,图上即得到了若干环。然后依次对于任意 \(i\),若 \(i\) 和 \((i+\dfrac{n}{2})\bmod n\) 不属于同一个环,交换他们的出边即可。最终所有 \(i\) 都满足 \(i\) 和 \((i+\dfrac{n}{2})\bmod n\) 属于同一个环,此时可以证明所有点都属于同一个环,故得到了一个哈密顿回路。使用并查集维护之,复杂度 \(O(n\alpha (n))\)。
82 NFLS 模拟赛 T1
对于 \(i\) 来说,假设要选的是后缀 \([j,i]\),考察匹配的形式。对于 \([j,i]\) 之间的礼物,可以匹配 \([j,i]\) 之间的任何人,而某个处于 \(x<j\) 的礼物,其能匹配的是 \([x+1,i]\) 之间的任何人。先依次考虑 \(x \in [1,j)\),维护可重集,若遇到礼物则加入可重集,若遇到人则删去大于等于其的最小值。最后可重集剩下的礼物和后面做每个点向小于等于其连边的二分图匹配。从左到右扫描 \(i\),显然 \(j\) 单调不降,后面的二分图匹配直接用线段树维护 Hall 定理即可。复杂度 \(O(n \log n)\)。
83 NFLS 模拟赛 T2
我们声称有解当且仅当对于任意 \(i\) 使得 \(a_i\neq b_i\),存在 \(j\) 使得 \(a_j = b_i\) 且存在一条 \(j\) 到 \(i\) 的路径使得对于其上任意一个点 \(x\),有 \(b_x\leq b_i\) 且 \(a_x \geq b_i\)。
所以每条边有一个存活时刻是关于 \(b_i\) 的区间。线段树分治即可。复杂度 \(O(n \log^2 n)\)。LCT 可以做单 \(\log\)。
84 P9494
好像是插入标记回收板子啊,需要平衡树有交合并所以是 \(O(n \log n\log V)\) 的。
85 P11590
如果向左的最靠右的位置比向右的最靠左的位置还要小,那么枚举这两个分界点后中间的部分只能填上下是好做的。左右的部分不难 \(O(n^2)\) DP 出来,这样总复杂度是 \(O(n^3)\) 的。
同理若向上的最下位置在向下的最上位置之上,也可以同理 \(O(n^3)\) 求出。
最后,考虑上述两种均不满足的情况,其形态形如数学里的那个弦图,你只枚举横着的两个点,那么竖着的两个点独立。不难对这些点预处理其区域内的 DP 值。这样复杂度也是 \(O(n^3)\) 的。据说这个题的范围就是放 \(O(n^3)\) 过,对此我也不理解。
86 P11706
当 \(A,B\) 确定时,线段树优化 DP 不难做到 \(O(n \log n)\)。
考虑问题本质上是有若干对 \((c_1,c_2)\),\(q\) 次询问给定 \(A,B\),求 \(\min \{A\times c_1+B\times c_2\}\)。式子除以 \(A\) 后即 \(c1+\dfrac{B}{A}c_2\),对此我们知道只需要考虑 \((c_2,c_1)\) 在平面直角坐标系的左下凸包上的点。
由于 \(c_1,c_2\) 均为 \([0,n]\) 之间的整数,所以凸包点数上界 \(O(n^{\frac{2}{3}})\)。套用最小乘积生成树的做法,递归寻找凸包上的点,对于目前两个点 \(p_1,p_2\),找一个在连线左下方的使得 \(\triangle p_1p_2p_3\) 最大的 \(p_3\),其必定也在凸包上。使用向量叉乘即可把面积转化为 \(A,B\) 固定的问题,复杂度 \(O((n^{\frac{5}{3}}+q)\log n)\)。
87 P10364
神奇题。
考虑依次对于每个 \(k\) 尝试计算 \(x \bmod 2^k\) 的结果。不妨考虑 \(x \equiv y \pmod {2^k}\),则 \(x \equiv y \pmod {2^{k+1}}\) 或 \(x \equiv y+2^k \pmod {2^{k+1}}\)。
考虑询问 \(2^{k+1}-y\),则你会得到 \(x-y+2^{k+1}\) 的因数个数。若 \(x \not \equiv y \pmod {2^{k+1}}\),则 \(x-y+2^{k+1}\) 只会有 \(2^k\) 这个质因子而不会有 \(2^{k+1}\),若因数个数是 \(k+1\) 的倍数,则 \(x \bmod {2^{k+1}}\) 有可能等于 \(y+2^k\),有可能的原因是其他质因数也有可能有 \(p^k\)。同理询问 \(2^{k+1}-(y+2^k)\),若有可能则递归进去。加上对询问的记忆化即可通过,我也不知道为什么,感觉是错误递归次数很小。
88 P11611
很神奇的转化。
考虑类似 2-SAT,给每个点建 \(0\) 点和 \(1\) 点,编号分别为 \(2i-1\) 与 \(2i\),然后每个 \(i\) 的两个点向 \(i+1\) 的两个点各连一条边,一个变量取值方案等价于一条从 \(1\) 或 \(2\) 开始的,\(2n-1\) 或 \(2n\) 结束的一条路径。限制相当于某个子串不能出现。
对限制建立 AC 自动机,在 AC 自动机上 DP,自动机上每个点 \(i\) 唯一对应了现在我们填到的前缀位置在哪里,每次向后移动一步,若移动到根则直接计算,否则从下一个点贡献上来。复杂度线性。
89 P4695
做法很多,考虑一些经典树上结构。
比如说考虑重链剖分,重链剖分解决这类问题,常见手法是将轻子树和重子树进行分类讨论。对于询问 \(u\),考虑答案点 \(v\) 在哪个位置。如果在 \(u\) 子树内则不难统计,若在 \(u\) 到根链上也不难统计。考虑若在外面,则分类讨论其属于 \(u\) 到根链上某个点的轻子树还是重子树。重子树只需要 \(O(\log n)\) 次查询 \(v\) 属于某子树内的答案,维护每个点到根路径权值和就能维护这个信息。而对于轻子树,考虑每个点维护轻子树内所有信息,按照 DFN 序做,本质就是做区间加。复杂度 \(O(n \log^2 n)\)。
90 P6377
考虑问题几乎等价于若干双端队列,每次从任意一个队列的开头或末尾取数。另一方面,整个序列的一段前缀和后缀则是一个非双端队列,只能从一侧取数,这可以被轻松转化为双端队列的形式。把前缀后缀拼起来中间加个 \(-\infty\) 即可。
现在考虑给定若干双端队列。我们发现对于某个队列相邻三个满足 \(a_{i-1}\leq a_i \geq a_{i+1}\) 的位置,双方都不太愿意取出 \(a_{i-1}\) 和 \(a_{i+1}\),如果取出,则对方必定会取出 \(a_i\),我方继续取剩下的一个。如果不这么取收益肯定非正,还不如先取别的。
所以可以将相邻满足 \(a_{i-1}\leq a_i \geq a_{i+1}\) 的三个数合并为 \(a_{i-1}+a_{i+1}-a_i\)。不断执行操作,现在每个队列都是单谷的。
此时最优操作就是每次取所有能取的数中最大的。不难反证说明这一点。
91 P6700
好题。
首先肯定是先做二类操作再做一类操作。进一步考虑令每次二类操作为 \(x \rightarrow y\) 表示字符 \(x\) 都变成 \(y\),并从 \(x\) 向 \(y\) 连一条有向边。若某个字符 \(x\) 未操作过则连 \(x \rightarrow x\) 的自环。可以发现最优策略中每个点恰有一条出边。整个图是一个内向基环树森林。
给每条边赋一个边权,\(x \rightarrow y\) 的边权为 \(c \times [x\neq y] + \sum \limits_{i} [s_i=x \land t_i \neq y]\),则选取的边权和就是至少所需的答案。
然而这不一定能构造到。考虑一个环的情况,除非这个环是自环,否则你无论如何都没有办法使得每个字符沿着出边移动。而另一方面,对于一个不是环的基环树,也就是有至少一个非环点,这时你可以把环上的某条边先操作到那个非环点上。此时答案确实是每条边权值和。这启发我们分类讨论纯环和非纯环。
先对每条边指定出边为边权最小的出边。如果没有连通块是纯环答案就是边权和,另一方面若所有连通块都是纯环则这个方案肯定需要被调整。而如果同时有纯环和非纯环,你可以先操作非纯环,然后对于每个环先将某个点操作到非纯环的某个空出来的叶子上。这样每个环会额外贡献 \(c\) 的代价,所以不一定是最优策略,有些环可能需要指定其中若干点钦定新的出边。
考虑最优策略,我们声称存在一个最优策略使得其所有纯环都是指定最小出边构成的纯环,这是相当显然的,可以反证。
这时可以设计 DP。\(f_{i,S}\) 表示考虑了 \([1,i]\),集合 \(S\) 内的这些纯环现在已经不再是纯环的答案。纯环是非自环所以至少有两个点,故 \(|S| \leq 2^{\frac{|\Sigma|}{2}}\),总复杂度 \(O(n+|\Sigma|^22^{\frac{|\Sigma|}{2}})\)。
92 P9041
问题形式是不交路径计数,考虑 LGV 引理。由于只需要判定是否有解,所以你考虑在模大质数 \(P\) 意义下考虑问题,给每条边随机赋一个 \([1,P)\) 之间的整数,一条路径权值视为边权乘积。那么区间 \([l,r]\) 的答案是一个矩阵的列秩,也就是按列插入线性基的大小。
考虑时间戳线性基即可。复杂度 \(O(nk^2+mk)\)。
93 CF1781F
考虑 \(f_{i,j}\) 表示生成长度为 \(2i\) 的字符串,最小前缀和 \(\geq j\) 的概率。
转移考虑字符串的第一个字符,若其为 \(\texttt{(}\),则考虑枚举和其一起插入的 \(\texttt{)}\) 的位置,然后递归进入两个子问题。同理若其为 \(\texttt{)}\),枚举和其一起插入的 \(\texttt{(}\),同样递归进入子问题。复杂度 \(O(n^3)\)。
94 CF1765C
考虑每次猜测正确的方案数和。显然对于第 \(i\) 次操作我们只关心之前进行过的猜测次数 \(l=\min(i-1,k)\),对每种 \(l\) 计算答案。
假设花色分别为 \(\texttt{A,B,C,D}\),不妨假设 \(\texttt{A}\) 是出现次数最小的之一,枚举其出现次数 \(x\),枚举 \(\texttt{B}\) 和 \(\texttt{C}\) 的出现次数 \(y,z \geq x\),要求 \(l-y-z\geq x\),如果 \(y,z,l-y-z\) 中任意一个也等于 \(x\),那么直接暴力计算答案,复杂度 \(O(n^3)\),否则只能做到 \(O(n^4)\)。
考虑不枚举 \(y,z\) 而只枚举 \(y\),限制是 \(z \geq x\) 且 \(l-y-z\geq x\),贡献形式形如多重组合数,这个应该可以预处理出来。复杂度 \(O(n^3)\)。
95 CF1737E
考虑蚂蚁的移动路径,考虑序列中每个向右的视为 \(0\),向左的视为 \(1\)。显然一个蚂蚁希望存活至最后至少要满足其初始向左,即权值为 \(1\)。考虑每个 \(1\) 前面极长一段 \(0\)。移动过程中,每个 \(1\) 首先会吃掉所有前面的 \(0\),然后形成若干个数做合并状物。不难发现点 \(i\) 想要吃掉前面所有数至少要满足前面极长 \(0\) 个数至少有一半。吃掉前面后,还需要能吃掉后面的所有数。记 \(f_i\) 表示 \(i\) 已经吞并了整个前缀 \([1,i]\) 后,能存活的概率,转移是相对简单的。复杂度线性。
96 CF1725I
一眼看过去这个题限制就很多,然后恰好 \(2n-2\) 条边也十分奇怪,边权限定 \(w_1<w_2<\cdots<w_{n-1}\) 也很诡异。
考虑从小到大依次加入每条边,加入一条边时你需要考虑图上在这两个连通块之间加边。不难注意到你必须恰好在两个连通块之间加两条边,且其中一条边权等于这条树边也就是目前的最大值,而另一条只需要比其小即可。设连通块大小分别为 \(s_1,s_2\),这是第 \(i\) 次加边,则贡献是 \((s_1s_2)^2(2i-1)\),\(2i-1\) 含义是另一条边的权值的相对顺序可以在之前的所有边的顺序中任意一个位置插入。
并查集维护,复杂度 \(O(n \alpha(n))\)。
97 NFLS 模拟赛 T1
DDP 板子。
98 NFLS 模拟赛 T2
差分约束板子。判定负环时判入队次数会超时,得判松弛次数才能过。
99 NFLS 模拟赛 T3
对于固定的根可以二分答案,显然所有新加的边都是从根指向某个点的。
二分答案 \(x\),从所有叶子往上,每次取出最深的叶子,向上跳 \(x-1\) 步,把这个点子树内所有其他点删去。然后自己再向上跳一步。由于 \(kn \leq 2\times 10^5\),所以只需要能做到复杂度关于 \(k\) 而不关于 \(n\) 就行。子树覆盖是 DFS 序区间,你用线段树维护之单次判定复杂度就是 \(O(k \log n)\) 了。
对于换根,不难发现做法是一样的,任意一个换根意义下的子树要么是 DFS 区间要么是 DFS 序区间补,这样总复杂度 \(O(nk \log^2 n)\)。
注意到相邻两个点答案变化量绝对值不超过 \(1\),复杂度 \(O(nk \log n)\)。
100 NFLS 模拟赛 T4
我们希望将操作转化为同种类型。对于区间 \([l,r]\) 补集加 \(1\),可以看作全局 \(+1\),然后区间 \([l,r]\) 减 \(1\)。这样所有区间一开始都视为区间加 \(1\),枚举 \(k\) 表示有多少区间是补集加,那么答案先加上 \(k\),然后相当于选出至多 \(k\) 个区间减去 \(2\),问最大值最小是多少。二分答案 \(x\),从前往后考虑每个位置,只要仍比 \(x\) 大,就选择包含这个位置的右端点最大的区间减 \(2\)。复杂度 \(O(n^2\log^2 n)\)。
不枚举 \(k\),改为在全局二分答案 \(x\),记全局最大值为 \(m\),我们声称若有解则存在 \(k\in[m-x,m-x+1]\)。为了让最大值小于等于 \(x\),显然有 \(k \geq m-x\)。其次我们声称若 \(k+2\) 可行则 \(k\) 也可行。考虑选取的 \(k+2\) 个区间变为补集加,若存在其中任意两个无交,则将两个都改为区间加显然不劣。若所有 \(k+2\) 个区间两两有交,那么必定存在某个最大值在所有区间交内,若不存在我可以选一个区间将其改为区间加。此时考虑最大值左右第一个左端点和右端点,都改为区间加依然合法,这是因为操作只对他们的交集部分加上 \(2\),而 \(k+2\) 足够大这些位置都依然合法。
至此,我们在 \(O(n \log^2 n)\) 的复杂度内解决了原问题。
101 CF1209E2
注意到 \(m\) 很大但 \(n\) 很小,由于最终是每行选最大值所以被选到的列也只有最多 \(m\) 个。将每一列按照这一列的最大值从大到小排序,则只有最大值前 \(n\) 大的列有用,因为剩下的列若选了则前面肯定某列没选,此时你可以用那一列的最大值替换这一列选的某个位置。
至此,\(m \leq n\),那就直接状压 DP 即可。\(f_{i,S}\) 表示前 \(i\) 列 \(S\) 这个集合内的行都被选了时的答案。转移枚举子集,复杂度 \(O(3^n\mathrm{poly}(n))\),足以通过。
102 CF1209F
首先有一个无脑的做法,直接跑 Dijkstra。为了比较两个大数,直接主席树做,倒着存数,比较就是求出最长公共后缀然后直接做就行。这样复杂度是 \(O(n\log^2 n)\) 的,应该是能过的。
不过有一个相当有趣的做法。我们考虑将每条边拆成 \(O(\log n)\) 个点,使得每条边权值是 \([1,9]\) 之间的整数。这样的话,最短路首先要求经过边数最短。所以建出 BFS 树一层层做就行。复杂度也是 \(O(n\log^2 n)\) 的,但很容易写。
103 CF1209G2
先考虑 G1,即 \(q=0\)。注意到若 \(a_l=a_r\),则最终得到的序列 \(b\) 中满足 \(b_l=b_{l+1}=\cdots=b_r\),这是显然的。使用并查集将这样的段合并后,每个段内的数只出现在这段内,这样答案是 \(n-\sum c_i\),\(c_i\) 是第 \(i\) 段中出现次数最大的数的出现次数。
考虑带修怎么做。我们希望能维护连续段,为此,考虑 \(c_i\) 表示 \(i\) 和 \(i+1\) 是否要求相等,对于某种数的相邻两个 \(x,y\),对于所有 \(x \leq i < y\),\(c_i \gets c_i+1\),则 \(c=0\) 的位置就是分段处。
由于每一段内所有数都只在段内出现,考虑对于每种数的每次出现,将这种数最左侧出现位置的权值加 \(1\),问题即查询所有分界点划分的区间权值最大值的和。注意到分界点的要求其实是最小值,所以直接线段树就能维护。具体地每个点维护左右两个散段的权值最大值然后合并直接做即可。复杂度 \(O((n+q)\log n)\)。
104 CF1545C
神秘的题。
考虑有些行肯定必选,这些行满足存在某列使得这个数出现次数恰为 \(1\)。不断找到这样的行,选取后删去与之矛盾的行。
考虑无法操作的终止状态,此时每列每种数出现次数至少为 \(2\)。而显然不可能存在某个出现次数至少为 \(3\),每种数出现次数都恰好为 \(2\)。由于保证有解所以最终必然是每种中选一个。这样可以发现目前的所有行中恰好能被划分为两部分。所以你现在考虑不能放在一起的两行连边构成二分图,接下来的计数是很容易的了。
105 NFLS 模拟赛 T1
直接模拟就行。
106 NFLS 模拟赛 T2
相当于求一条有向路径使得包含于这条有向路径的路径权值最大。
包含一条有向的路径的有向路径可以写成 DFS 序区间形式,然后对一维扫描线另一维线段树维护就行。
107 NFLS 模拟赛 T3
对于每个点求距离其最近的关键点。
对于 \(x\) 坐标相同的点一起计算答案。可以发现 \(x\) 确定时每种 \(y\) 只有至多 \(2\) 个有用的点,总有用点数 \(O(n)\)。然后 \(x\) 确定时式子是形如 \(\min \{k_ix+b_i\}\) 的,凸包或者李超树都行。
108 NFLS 模拟赛 T4
记 \(t_i\) 表示第 \(i\) 只怪死亡前进行了几次攻击,\(c_i\) 表示第 \(i\) 只怪之前有多少英雄。则对于 \(i\) 来说其必须在前 \(Ht_i+c_i\) 次攻击内死亡,问题是一个二分图匹配形式。根据霍尔定理,将所有怪按照 \(Ht_i+c_i\) 从小到大排序,对于每个 \(i\) 判定 \(Ht_i+c_i \leq ik\) 是否成立。
对于原问题,从小到大枚举 \(t\),并选择一些 \(t_i=t\),显然应该按 \(c\) 从小往大能取就取。容易做到 \(O(MH)\),注意到一个人后面跟着的怪的 \(c\) 都相同,故不难做到 \(O(H^2)\)。
109 CF1528E
考虑一个合法的树应该是一棵根向或叶向树,或者他们拼接在一起的形式。
记 \(f_i\) 表示深度为 \(i\) 的叶向树个数,然后通过一些分类讨论就能简单得到答案了。
110 CF1336E1
考虑对给定数求出异或线性基。记线性基大小为 \(m\)。现在对于异或线性基中数 \(i\) 若有 \(c_i\) 种方式得到,则整个序列中得到 \(i\) 的子集数是 \(c_i2^{n-m}\),因为每种线性基外取数的方式和一种线性基内部取数的方式与一个整体取数的方式一一对应。
对于线性基内部,考虑折半搜索。中间合并时,注意到低位 \(\dfrac{m}{2}\) 个数的最高位都不超过 \(\dfrac{m}{2}\),所以 FWT 就可以。复杂度 \(O(m^22^{\frac{m}{2}})\)。
111 CF1279E
这个题不太难。考虑一个排列合法的形式,肯定是每个置换环都是一个连续段,并且每段 \([l,r]\) 满足 \(p_l=r\)。这样就不难计数了。对于原问题,肯定是从前往后依次钦定一个前缀并计数以这个前缀为开头的合法排列个数。这个前缀有若干段已经成为置换环了,还有一个散的后缀没有。这样复杂度单次应该是 \(O(n^2)\) 或者 \(O(n^3)\),足以通过。
112 P14509
总而言之你要做的大概就是对于树上每个点 \(i\) 计算 \(\sum \limits_{j \in \mathrm{subtree}_i} f(j+d_i)\)。
其中对 \(f\) 的计算考虑在 01-Trie 上统计。你发现子树合并就是 Trie 合并,而每个点继承儿子除了合并外,\(d\) 还减去了 \(1\),体现为全局减 \(1\),这又是很经典的问题。从低向高位建立 01-Trie,从根开始不断交换左右儿子并往原来 \(0\) 的方向递归就行。复杂度 \(O(Tn\log n)\)。
113 NFLS 模拟赛 T1
注意到全局最大值必然是某一边的最大值,然后枚举这一侧的最小值就行。分类讨论这一侧最小值是否为全局最小值,这两种情况的做法不一样,但都不难。
114 NFLS 模拟赛 T2
模拟是没什么意义的,总而言之你要判定 \(3 \times 10^8\) 次,每次给定 \(x, y \leq 5\times 10^4\),判定是否有 \(\gcd(x,y)=1\)。
我比较笨,所以考虑做一个基于值域预处理的 \(O(V)-O(1)\) GCD 即可。其做法简述是对于任意正整数 \(n\),存在其一个分解 \(n=abc\),满足 \(a\leq b \leq c\),且 \(c \leq \sqrt n\) 或 \(c\) 为质数。构造是归纳,对于 \(n\) 为质数显然,否则找到 \(n\) 最小质因子 \(p\),记 \(\dfrac{n}{p}\) 分解为 \(a \leq b \leq c\),则可以证明 \(a \times p, b, c\) 从小到大排序就是一个可行的构造。
然后求 \(x\) 和 \(y\) 的 GCD 先将 \(x\) 分解,然后依次求 \(a,b,c\) 和 \(y\) 的 GCD。注意到此时要么有其中一个是质数,要么其中一个小于 \(\sqrt n\),前者直接做,后者预处理任意两个不超过 \(\sqrt n\) 的数的 GCD 后做一次辗转相除就能直接查表了。
115 NFLS 模拟赛 T3
点分树随便做一下就是 \(O(n\log^2 n)\) 的。
116 炼石 NOIP R25T1
事实上答案是 \(n(n-1)\)。不过你直接因数分解硬算也是可以 \(O(\sqrt n)\) 解决的。
117 炼石 NOIP R25T2
所有点对答案和多组询问是类似的。
经典做法是你考虑动态 DP,但是矩阵的三方乘法复杂度还是太高了。
考虑猫树分治,中间的分界线处理出向左向右的 DP 值。这样复杂度显然是 \(O(m^2n\log n)\) 的,足以通过。
118 炼石 NOIP R25T3
这个就是说考虑将比大小转化为一个前缀完全相同,下一个位置比其大。建出子序列自动机反而不方便做 DP,因为其本质失去了一些信息,而直接在序列维度考虑这个问题是可以前缀和优化转移的。状态设计是相对简单的,复杂度 \(O(nm)\)。
119 炼石 NOIP R25T4
最终必然有一个点在圆上,枚举这个点。二分圆半径 \(r\),则可行的圆心在以这个点为圆心半径为 \(r\) 的圆上。对于其余每个点,其会被包含要求圆心在这个圆的某段圆弧上。本质上就是序列区间形式。然后你要对于每个点判定所有包含这个点的区间构成的所有数异或最大值是否至少为 \(k\)。线段树分治做或者带删线性基都行。
这样复杂度不太好,考虑一个经典套路。按照随机顺序枚举所有点,先判定答案有没有可能比之前的严格小,有可能时才进去二分。这样二分次数是前缀最小值个数是期望 \(O(\log n)\) 的,而判定是一个 \(\log\) 的,这样就可以通过了。
120 P14348
经典问题之线段树维护分段函数。这个题也是类似的。相当于若干区间 \([l,r]\),每次超过区间就会变到区间内。此时最终的位置和答案都是分段一次函数形式,线段树维护即可。
121 P14349
显然最优的是从小到大在环上排,这样减去的贡献是 \(2(\max c-\min c)\)。
按 \(c\) 从小到大排序,选一个区间使得 \(v_l+v_r+f(l+1,r-1)-2(c_r-c_l)\) 最大。\(f\) 表示区间内前 \(m-2\) 大的 \(v\) 的和。
注意到区间权值有四边形不等式,所以有决策单调性,对决策点分治,查询用主席树即可。复杂度 \(O(n\log^2 n)\)。
122 P14389
对于每个 \(l\) 求最远的能到的位置 \(p_l\),查询即判断 \(p_l \geq r\) 是否成立。
按 \(l\) 从大到小扫描线就行了,可能要维护个线段树。
123 P14408
字符串给定的形式是 \(A,B,C,D,E\),这是相当奇怪的。
区间操作转化成差分,每次操作选一条边,花费边权的代价将连接的两个点状态取反,则有些点要求被操作奇数次,有些点要求被操作偶数次。
你的操作肯定不会成环,而一条路径只会对路径的两端造成影响。所以你本质上要对奇数点求一般图最小权完美匹配,两点边权是图上最短路。
这看起来完全不可做啊,但是字符串给定的形式是 \(A,B,C,D,E\),所以只有 \(O(1)\) 个奇数点,有点搞笑。
124 P14383
对不能同属一个港口的连边。如果不是二分图则无解,否则答案为 \(2\) 的连通块个数次方。
线段树优化建图可以直接做。也可以用一些手法把显式建图干掉,不过不是必须的。
125 CF794F
【模板】线段树。
126 CF794D
对于两个相连的点 \(u,v\),如果对于任意 \(w\neq u,v\),\((u,w)\) 和 \((v,w)\) 的状态完全相同,那么我们直接令 \(x_u=x_v\)。
从任意点开始依次确定每个点的答案,对于每个点 \(u\),先将其邻居中符合这个条件的 \(v\) 赋值 \(x_v=x_u\)。对其他点,枚举其颜色 \(x_v\in \{x_u-1,x_u,x_u+1\}\),从小到大取一种没用过的颜色即可。我也不知道为什么对。
127 炼石 NOIP R26T1
分类讨论,垃圾。
128 炼石 NOIP R26T2
分块,垃圾。
反正就是你对整块建虚树做 DP,散块对整块的贡献也是差不多建虚树就能做。

浙公网安备 33010602011771号