九月杂题
1.
CF1641D Two Arrays
对交的大小容斥,有 \([S \cap T = \varnothing] = \sum\limits_{V}[V \subseteq S][V \subseteq T](-1)^{|V|}\)。由于条件具有区间包含单调性,按 \(w\) 升序后求出第一个有匹配的 \(l\) 及其最小 \(r\),接下来只需要关心 \(\subseteq [l, r]\) 的区间。双指针即可。
2.
CF1696F Tree Recovery
枚举一条边,则剩下的所有都可以还原,暴力检查合法性即可。
- 不确定的信息,尝试枚举。
3.
CF1672F2 Checker for Array Shuffling
将每个 \(a_i\) 向 \(b_i\) 连边,形成一张图。我们希望把这张图变成一堆自环的形式。由于每个点都有出边,因此先拎一个环出来。显然对于一个有 \(c\) 条边的环,我们要让它变成一堆自环,最少的操作次数是 \(c - 1\)。将所有环都复原,则最小总次数为 \(n - 环数\)。那么我们要最大化环的数量。由于环不能经过重复点,容易发现我们最少只能搞出 \(cnt_{mode}\) 个环来(\(mode\) 是众数)(这些环里可能有自环,但是不影响)。因此最大操作次数即为 \(n - cnt_{mode}\)。而要检查一张图是否达到这个上界,也只需要检查删掉众数对应点剩下的图中,是否存在环。如果存在环,则可以把这个环扭到某个包含众数的环中,把环数减少一个。于是拓扑排序即可。
- 不是排列也可以 \(a_i \rightarrow b_i\)。
- 消圈的思想。
4.
CF1656F Parametric MST
\(f(i, j) = (a_i + t)(a_j + t) - t^2\),按 \(a\) 排序,则由 Prim 容易发现每个点要么连到 \(1\),要么连到 \(n\),这由其 \(a_x + t\) 的正负性决定。由于每个 MST 的权值是关于 \(t\) 的一次函数,因此每个 \(t\) 的答案构成凸包。而刚才的构造证明了凸包的拐点只能在每个 \(-a_i\) 处取到。因此只需要检查每个 \(t = -a_i\) 处的值即可。
5.
CF1672H Zigu Zagu
考虑要求是删除 01 交替串,则相邻 0 和相邻 1 是特殊的。删除之后两边会拼起来,也就是每次删除的区间在原串中对应的区间是可以包含的。但是考虑包含的端点,一定是相邻 0 和相邻 1。那么这就相当于给相邻 0 和相邻 1 做匹配,而匹配完之后多下来的只好自己解决。于是大胆猜测答案即为 \(\max \{ \ \# 相邻 0, \#相邻 1 \ \}\)。一写发现过了。
6.
CF1515F Phoenix and Earthquake
容易通过归纳和反证得到有解当且仅当 \((n - 1)x \le \sum a_i\)。此时考虑构造。我们任取一棵生成树,然后剥叶子。任取一个叶子,若其当前可以删除(连上父边),则删去它显然不影响合法性。而若不能删除,则我们先扔掉这个叶子和父边,考虑剩下的图,发现剩下的图一定是有解的。于是先对剩下的图构造,构造完之后这条边一定也就能连了,连上即可。
-
剥叶子的构造(从特殊考虑)。
-
?延迟了决策。
7.
CF562F Pudding Monsters
\(\max - \min = r - l\),单调栈 + 线段树维护即可。
8.
CF1603D Artistic Partition
注意到题面要求最小化,而若 \(r \le 2l\),则 \(c(l, r) = r - l\)。因此若 \(k \ge \log n\),直接摆一堆 \(2\) 的幂就最小了。而对于 \(k\) 小的情况,我们 dp。
通过感性理解可以发现决策单调性,那么通过上式结合整除分块和前缀和可以快速计算转移系数。虽然每次计算可以通过预处理做到 \(\mathcal{O}(1)\),但是其实暴力整除分块就能过了。理论复杂度应该是根号 \(\log\) 的,但显然跑不满。
9.
CF438E The Child and Binary Tree
一棵二叉树由左儿子、根、右儿子构成,因此设一棵二叉树的生成函数为 \(f(x)\),点权的生成函数为 \(g(x) = \sum\limits_i x^{c_i}\),则有 \(f(x) = f(x)^2g(x) + 1\),可以解出 \(f(x) = \frac{1 \pm {\sqrt{1 - 4g(x)}}}{2g(x)}\)。由于在 \(x = 0\) 处需要收敛,我们取 \(f(x) = \frac{1 - {\sqrt{1 - 4g(x)}}}{2g(x)}\)。接下来就是多项式了。
10.
CF1601D Difficult Mountain
考虑怎样的两个人是矛盾的,若 \(s_i < a_j \land s_j < a_i\),则 \(i\) 和 \(j\) 不能同时上山。但是若 \(a_j \le s_j\),则会发现 \(i\) 完全偏序 \(j\),也就是如果最优解中出现 \(i\),则我们换成 \(j\) 不会变得非法。因此扔掉所有这样的 \(i\)(显然被同一个 \(j\) 偏序的若干 \(i\) 不能同时选),答案不会变化。然后发现剩下的按 \(\max \{ a, s \}\) 排序就可以了。
11. +
CF700E Cool Slogans
显然从后往前 dp,\(f_i\) 表示 \(i\) 后缀的最大答案(要选 \(i\))。考虑转移。现在我们要求 \(f_i\),假设最优解是 \([i, j]\),那么应当从 \(f_{j - border + 1}\) 处转移。可是显然这个地方的 \(f\) 并不一定就可以转移过来,因为它的最优解并不一定就是 \([j - border + 1, j]\)。但是注意此时到 \([j - border + 1, j]\) 这个串一定在某个更靠前的 \(f\) 里作为最优解,因此就从那个 \(f\) 里转移就好。于是采用刷表,每次把这个 \(f\) 转移给匹配当前串的所有后缀。但是还要知道这个 \(f\) 的最优解是取到哪。对于这个问题,发现对于所有贡献最优解的 border,一定取长度最小的。因此尝试对每个后缀再维护其最优解对应的 border 长度,这样每次就只需要找到最靠前的匹配这个 border 的位置,就可以知道这个 \(i\) 的最优 \(j\) 的位置了。
12.
CF1515G Phoenix and Odometers
显然只考虑 \(v\) 所在强连通分量。我们的目标是经过每个环若干次,使得总长度 \(l + s \equiv 0 \pmod t\)。由裴蜀定理,所有合法 \(l\) 一定是当前强连通分量所有环长的 \(\gcd\) 的倍数。设 \(\gcd = g\),则由裴蜀定理,我们希望 \((g, t) | s\)。接下来只需要对每个 SCC 求出 \(g\)。考虑在 dfs 树上求,通过对树上的每种非树边讨论,可以得到每种非树边 \((u \rightarrow v)\) 的贡献都是 \(dep_u + e_{u, v} - dep_v\),只需要对所有非树边的这个东西求 \(\gcd\) 即可。
13.
CF1654F Minimal String Xoration
显然按位考虑,从低往高来。建立类似线段树的结构,每个点从两个儿子合并答案。设 \(f_{x, i, j}\) 表示 \(i\) 开始的长为 \(2^x\) 次方的区间中的串里异或值为 \(j\) 得到的串的排名。其中 \(2^x | i, 0 \le j < 2^x\)。那有了两个儿子的答案之后,当前区间所有 \(y\) 的排名容易通过讨论 \(2^x\) 位并用类似后缀排序里面那个对 pair 排序求出。每次 sort 就能过了。
14.
CF666E Forensic Examination
ht 的笛卡尔树上线段树合并即可。
15.
CF1523E Crypto Lights
只需要求出每个时刻还没结束的概率和。枚举时刻 \(i\),那么先放好 \(i\) 盏亮灯并在两两中间插 \(k - 1\) 盏暗灯,剩下的随便放即可。
16.
CF1458D Flip and Reverse
考虑一个数轴,最开始在 \(0\)。每次遇到一个 \(1\),就往右走一个单位长度,否则往左。每次走完之后就把刚才所在的点向当前点连一条有向边。那么再观察操作,发现它只相当于反转了一个环上所有点的遍历顺序。也就是说,在所有操作中这张图是不变的。设最终停留在 \(t\),那么也可以所有 \(0 \rightarrow t\) 的欧拉路径和所有合法串一一对应。于是只需要求出字典序最小的欧拉路径。只需要每次贪心走 \(0\) 边,不能走(没了或者走过去后得回来但回不来)再走 \(1\),就可以构造出最小的串了。
- ?想到图论
17.
CF1442D Sum
调整法容易证明至多一个数组不是全空或全满。分治求出删去每个点之后的 01 背包,再和这个点合并一下更新答案即可。
- 下凸包的 \(\max+\) 卷积不是下凸包,\(\min+\) 卷积才是!!!
- 分治。
18.
CF547E Mike and Friends
先把询问差分掉,然后按下标顺序扫每个询问,每次加入当前后缀并在 SA 上查询区间内被加入的后缀的个数即可。
19.
CF521D Shop
赋值只会做一次,视为加法。加法一定先做值大的,排好序。统计贡献的形式都为乘法,取个对数。则每次加法对所有 \(\ln a_i\) 的和的贡献是可以计算的,也可以表示为将贡献加上一个值。那么直接取贡献最大的若干操作做掉即可。
20.
CF1553H XOR and Distance
Trie 树上 dp,每个子树求出子树每个值的答案,以及子树内的数异或上这个值之后的最大最小值。注意到如果 \(x\) 这一位为 \(1\),相当于交换左右儿子。那么合并是容易的。
21.
CF605E Intergalaxy Trips
显然每个点只会走到答案更优的点。考虑从终点开始确定,终点的答案为 \(0\)。设当前已经确定答案的点按答案升序依次为 \(a_1, a_2, \cdots, a_m\),则对于点 \(j\),有 \(f_j = p_{j, a_1}f_{a_1} + (1 - p_{j, a_1})p_{j, a_2}f_{a_2} + \cdots + (1 - p_{j - a_1})\cdots(1 - p_{j, a_{m - 1}})p_{j, a_m}f_{a_m}\)。显然每次取出当前答案最小的扩展,并更新其他所有未知点答案。可以根据 dijkstra 感性理解。
22.
CF1580E Mathematics Curriculum
显然对于一个位置 \(p\),包含 \(p\) 的区间的本质不同最大值个数等于其在笛卡尔树上的深度。那就相当于问你笛卡尔树上深度为 \(m\) 的点有 \(k\) 种的排列有多少种。大力 \(f_{i, j, k}\) 表示长度 \(i\) 的排列,深度为 \(j\) 的点有 \(k\) 个的方案数,转移就平方枚举一下然后乘一个组合数即可。总复杂度 \(\mathcal{O}(n^5)\),但是能过。
23.
CF1404D Game of Pairs
首先注意到所有数的和 \(n(2n + 1) \equiv n \pmod {2n}\),因此只要我们能构造出和模 \(2n\) 为 \(0\) 或 \(n\) 的方案,就可以视为有解。也就是只需要和 \(\equiv 0 \pmod n\)。然后来考察 \(1\) 到 \(n\) 的和 \(\frac{n(n + 1)}{2}\)。发现当 \(n\) 为偶数的时候,这玩意模 \(n\) 一定不为 \(0\),因此偶数的时候只需要构造 \((i, n + i)\) 即可作出无解。当 \(n\) 为奇数的时候,这个是 \(n\) 的 \(\frac{n + 1}{2}\) 倍,也就是模 \(n\) 得 \(0\)。因此只需要想办法在每个 \((i, n + i)\) 里选出一个。发现这一定是可以做到的,考虑把给出的 \((a_i, b_i)\) 视为边,所有 \((i, n + i)\) 也视为边,建出一张图来。由于每个点度数不超过 \(2\),且任一条路径一定是两种边交替走的,因此得到的图一定是一堆偶环。因此直接二染色,然后输出所有黑点(或白点),我们就得到了一组合法的方案。
-
考察。
-
有点像匹配,类似的图论建模。
24. +
CF573E Bear and Bowling
显然有暴力 dp:\(f_{i, j} = \max \{ f_{i - 1, j}, f_{i - 1, j - 1} + ja_i \}\)。我们希望证明对于 \(i\) ,每个 \(j\) 的最优答案集合互相包含,这样这个 dp 随第二维就是凸的了。考虑一个贪心,每次选择贡献最大的点选中。贡献的定义是 \((x + 1)a_i + y\),其中 \(x\) 是前面已经选的数的个数,\(y\) 是后面已经选的数的和。通过一些分类讨论可以证明这个贪心是真的。于是这个 dp 的第二维是凸的。然后再观察这个转移,发现每个 \(j\) 选择两个中的哪一个是单调的,于是只需要找到这个位置,然后对两边分别维护。可以使用平衡树来做。
25. +
CF547D Mike and Fish
将每个给出的点视为边,在行列之间建边。那相当于给每条边定向,希望每个点出入度相差不超过 \(1\)。可以想到欧拉路径。但是欧拉路径不方便对一个连通块整体规划奇度点的出入度,因此考虑把所有奇度点和虚点建边,容易发现这样建出的图每个点度数都为偶数,因此每个连通块一定存在欧拉回路。对每个连通块跑一下,然后把所有边按照被经过的方向染色即可。
26.
CF576E Painting Edges
考虑线段树分治,但是没法知道每条边每个时刻到底什么颜色。于是在做的过程中确定。当做到一个询问 \(x\) 的时候,判断其能否执行。接下来这条边的颜色一直到下一个涉及到这条边的询问都是确定的,于是把这一段再扔进线段树里面就好了。
27.
CF487E Tourists
建圆方树,设每个方点的权值为所有相邻圆点的权值 \(\min\),则要求的就是路径上所有点(方或圆)的权值 \(\min\)。但是一次更新之后不好维护儿子方点的权值,但是注意到每次询问除了以儿子方点为 LCA 的情况,自己都会被包含进询问路径。那么就不需要在方点处维护父亲圆点的权值。每次查询时若 LCA 是方点就特殊处理一下它的父亲就好了。这样每次修改就只需要更新父亲方点的权值了。
28.
CF1621G Weight Increasing Subsequences
枚举最后一个数位置,则相当于前面有一些位置有 1 的权值,要求所有上升子序列的权值和。考虑对每个位置算贡献,一个位置 \(x\) 产生贡献当且仅当最后一个数选在某个位置 \(p_x\) 之前。先对前后分开算,前面容易,则现在要求以某个点开始的,结尾在某个位置之前的上升子序列个数。
这并不好做,但是观察到 \(p_x\) 是比 \(x\) 大的最后一个位置,也就是说从 \(i\) 开始的上升子序列除了在 \(p_x\) 结束的,都会被算进来。那我们只需要算出在 \(p_x\) 结束的然后把它们减掉就好了。而这个东西,又注意到每次我们只关注权值在 \([a_x, a_{p_x})\) 之间的点,于是只需要对 \(p_x\) 相同的单独拉出来只跑这一段值域的点就可以了。显然不同 \(p_x\) 对应每个后缀最大值,每个 \(p_x\) 跑的值域就是下一个后缀最大值的权值到自己这个权值。那么每个点就只会被跑一遍,总复杂度就是单 \(\log\) 的。
- 嗯。
29.
CF1615F LEGOndery Grandmaster
先把所有偶(或奇)数位全部异或 \(1\),然后发现操作就是交换相邻的 01。直接对着这个平方 dp 就好了。似乎有高妙线性做法,还没看。
- ?所有偶(或奇)数位全部异或 \(1\)
30.
CF516D Drazil and Morning Exercise
首先对每个点求出最远点距离。显然这是到直径两端距离 \(\max\)。
那么发现树上每个点的距离,一定是从直径中点,向外单调增加。那么想到以直径中点(也就是距离最小的点)为根,这样如果确定了连通块的根,那么可以确定最多能选到哪里。但是直接做可能需要 dsu on tree,我们转而对每个点考虑它能贡献哪些连通块的根。那这显然是其向根路径的一段前缀,可以直接树上差分。而要求出这个前缀也只需要树上倍增一下就好了。
31.
CF1637G Birthday
手玩一下发现最终全部变成 \(2\) 的整次幂。那么设 \(f(n)\) 为把 \(1\) 到 \(n\) 的数全部变成同一个 \(2\) 的幂。但是这不太好做,因为如果递归的话子问题可能要剩下孤立的 \(1\) 和 \(2\)。
于是考虑弱化一下,\(f(n)\) 表示把 \(1\) 到 \(n\) 的数全部变成 \(2\) 的幂,最后再统一处理。那么这样就可以递归了,设 \(p\) 为 \(\le n\) 的最大的 \(2\) 的幂,讨论 \(p\) 和 \(n\) 的关系可以递归到子问题。
- 弱化一下。
32.
CF1553G Common Divisor Graph
先求出所有连通块,显然个数不会很多。显然答案不超过 \(2\),非平凡的情况只有两个数都是奇数,只有此时答案可能为 \(2\)。要检查答案是否为 \(1\),相当于要检查是否有一个数操作过后会合并这两个数所在的连通块。那么只需要枚举每个数,看看它会合并哪些连通块,然后枚举两两被合并的连通块,看看有没有询问有这个需求。如果有的话这个询问就是 \(1\),否则为 \(2\)。由于一个数的本质不同质因子很少,因此每次不会合并很多连通块。就能过了。
33.
CF1408G Clusterization Counting
从小到大加边,当新加入一条边的时候,若其所在的连通块不是一个团,那么这个连通块中不会出现包含这条边的团。因此若这次加边合并了两个连通块,那么这两个连通块内部选出团的方案都是完全独立的。因此设 \(f_{i, j}\) 表示连通块 \(i\) 中选出 \(j\) 个团的方案数,每次合并连通块暴力卷积就可以了。当加入一条边导致一个连通块成团,就把 \(f_{i, 1} \leftarrow f_{i, 1} + 1\)。
- ?怎么这都不会
34.
CF576D Flights for Regular Customers
对可能的 \(m\) 张图分开考虑,那么希望求出走了 \(t_i\) 步之后有哪些可达点。这个可以直接矩阵快速幂,bitset 优化。求出这个之后就是一个多源最短路,bfs 即可。这样是 \(\mathcal{O}(\frac{n^3m\log d}{\omega})\) 的。
由于向量乘矩阵复杂度较优,我们考虑预处理邻接矩阵的 \(2^i\) 次方。考虑新加一条边的影响,会让 \(g_{0, i, j}\) 变为 \(1\)。这个变为 \(1\) 之后,可能会和 \(g_{0, j, k}\) 或 \(g_{0, k, i}\) 一块让 \(g_{1}\) 中的某些东西变成 \(1\)。每次只需要暴力找到会变的东西,然后再到下一层找变了哪些。如果本来那个东西就是 \(1\) 就不往下走了。显然这样做的复杂度就是总变化次数乘以 \(n\)(枚举另一边),也就是 \(n^3\log d\)。然后向量乘矩阵再多源 bfs,总复杂度 \(\mathcal{O}(n^3\log d)\)。
- 三次方做法。
35.
CF1704F Colouring Game
显然双方的策略一定先选相邻的 \(\texttt{RB}\)。之后轮流选择一个自己的字符,选不动就输了。那观察到第一阶段的每次操作不改变 RB 数量的相对关系,而第二阶段中赢家在字符数量不同的情况下一定是字符多的那一方。因此若初始字符数量不同可以直接判断。否则就是谁取完了最后一个 \(\texttt{RB}\),谁就赢了。于是我们只需要考虑 RB 间隔的段,每个极长的 RB 间隔段都相当于子游戏。对这个东西的 SG 打表,可以发现一些长度过后出现了 \(34\) 的循环节。于是我们就做完了。
- 考虑过程中的不变量。
36.
CF1684G Euclid Guess
首先注意到对于比较小的数,可以构造 \((3t, 2t)\) 直接消掉。而若出现了 \(2t > m\) 的数,则一定无解。那接下来就是要搞掉 \(m/2, m/3\) 之间的数。对于两个数 \(a, b(a > m / 3, b < m / 3)\),发现可以构造 \((2a + b, a + b)\) 来消掉它们。那么我们尝试用这个构造消掉比较大的数,只需要对每个大数找到一个匹配的小数。小数如果失配就用 \((3t, 2t)\) 消掉。发现 \((2a + b, a + b)\) 这个构造可能会涉及其他的数,但是过程结束时一定有最后的数是 \(a\) 的因数。因此一定可以只用 \(b | a\) 来搞掉 \(a\)。于是只需要把所有大数向符合条件的小数连边,求一个完美匹配就行了。可以网络流解决。
37. +
CF1616H Keep XOR Low
从高位往下考虑,对于所有数的最高位,若 \(x\) 这一位为 \(1\),则最高位为 \(0\) 和 \(1\) 的可以都选,也可以只选一个。只选一个,则一定合法,即 \(2\) 的幂次。否则同时递归两边,在 Trie 树上设 \(f(p, q)\) 表示在 \(p\) 子树和 \(q\) 子树里选出一些数的合法方案数。每次对 \(x\) 的这一位讨论,若为 \(0\) 则只能同时向左向右递归,方案相加。否则由于同一子树之内的选择没有限制,此处的方案数大致为 \(f(ls_p, rs_q) \times f(rs_p, ls_q)\)。当然视具体实现可能要讨论某一个里面为空的方案,但大概就是这样了。
- 挺厉害的。
38.
CF1610F Mashtali: A Space Oddysey
周围边权为偶数的点一定非法。剩下点一定合法。考虑构造。
先把两张图分开,边权为 \(1\) 的子图称为 \(G_1\),同理 \(G_2\)。那么对于两张图各自,我们希望奇度点出入度相差不超过 \(1\)。因此奇度点向虚点连边,分别欧拉回路即可确定方向。但是对于两张图中度数都为奇数的点,我们希望它在两张图中出入度。因此,在这两点之间连一条边,即可保证这件事。当然这两个点到虚点的连边删去。最后跑欧拉回路即可对边定向。由点度数均为偶则一定存在。
39.
CF1503D Flip the Cards
先全部翻到 \(a_i < b_i\) 的状态,然后通过手段(考虑 \((a_i, b_i)\) 二维点)观察可以发现若两张卡的 \(a, b\) 对应的区间没有包含关系,则这两张卡不能有相同的翻转状态。因此数据结构加速 bfs 跑二分图染色,最后判断方案是否可行即可。中间的交界处需要特殊判断。
当然这不是正解。再次通过手段观察(结合 Dilworth 定理)可以发现所有 \((a_i, b_i)\) 必然满足 \(a_i \le n\),\(b_i > n\)。按照 \(a_i\) 排序,则我们希望将所有数划分为两个下降子序列。观察到将所有数划分为极多个值域不交的子区间之后,每个子区间的选择是独立的。于是只需要最优化每个子区间。由经典(?)贪心,我们只需要每次把当前数扔进两个子序列中最后一个数较小的里面。可以证明在每个子区间内部这样的策略可以得到唯一合法解。于是就可以了。
- 经典(?)贪心。
40.
CF1667D Edge Elimination
从链的情况开始考虑。观察到链有解当且仅当长度为奇数。那么在树上,我们考虑将原树划分为若干长度为奇数的端点不相交的链。可以证明能进行这样的划分等价于有解,并且也可以通过这样的方式构造。
也可以从叶子往上考虑。相当于还是考虑剥叶子。
41.
CF1495D BFS Trees
显然若 \(i, j\) 间最短路不止一条则无解。否则对于每个 \(x\),只需要把其可能的父亲 \(y\) 个数相乘即可。可能的父亲既要满足 \(i\),也要满足 \(j\),因此合法的条件为 \(dist_{i, y} + 1 = dist_{i, x} \land dist_{j, y} + 1 = dist_{j, x}\)。
- 分开考虑 \(i, j\) 的限制。

浙公网安备 33010602011771号