题目记录(Before 省选 ver.)

T1. P6891

首先考虑有没有 \(\mathrm O(n^2)\) 的做法。此时考虑定义 \(dp_{i,j,A/B}\) 表示目前选了 \(i\) 个数,其中有 \(j\) 个是 \(A\) 数组里的,最后一个数是 \(A\) 还是 \(B\) 中的。

然后此时考虑定义 \(dp_{i,A/B,0/1}\) 表示当前选择了 \(i\) 个数,其中最后一个选的是 \(A\) 还是 \(B\) 数组里的,\(A\) 最大/最小有多少个。

那么此时的转移就很简单了,可以做到 \(\mathrm O(n)\) 转移。构造答案可以直接倒着构造。

T2. AT_arc202_c

首先有 \(R_{\gcd(x,y)} = \gcd(R_x,R_y)\)

注意到 \(\text{gcd}\)\(\text{lcm}\) 的本质其实是对于所有因数的幂次取 \(\min\) 或者取 \(\max\)

发现题目要求的形式是求一个集合的 \(\text{lcm}\),然后根据上面的观察,考虑对于这个东西做一个 \(\min-\max\) 容斥得:

\[\text{lcm}(S) = \prod_{T \subseteq S} R_{\text{gcd}(T)}^{(-1)^{|T|-1}} \]

这个 \(\text{gcd}\) 不好处理,所以考虑把它转化为有关于因数的,则考虑定义 \(R_n = \prod_{i \mid n} F_i\),则我们有:

\[= \prod_{T \subseteq S} (\prod_{i \mid \text{gcd}(T)} F_i)^{(-1)^{|T|-1}} \]

则考虑把 \(i\) 放到外面枚举,可得:

\[= \prod_{d} F_d \times [\sum_{u \in S} [d \mid u] \neq 0] \]

然后只需要用反演求出 \(F_d\) 即可。

T3. P14455

简单构造题,场掉了。

假如我们设 \(1\) 为这棵树的根节点,那么 \(w_{1,i} \oplus w_{1,j} \oplus w_{i,j}\) 就可以确定 \(i,j\)\(\text{lca}\) 的编号。

然后考虑对于每一个点都维护其子树集合,然后按照这个集合的大小从小到大去考虑节点即可。具体的,如果遇到非叶子节点 \(u\),考虑去枚举他的子树中的所有点然后看有那些节点没有找到父亲,这些点的父亲就一定是 \(u\)

T4. P14830

很牛牛的题啊!

发现直接求 border 不好搞啊,所以考虑把字符串反过来然后倒着差入变为 \(a_1 a_n a_2 a_{n-1} \cdots\),然后你发现求 border 变成了求回文串个数。除了回文串还有一下两个要求:

  1. 长度是偶数。

  2. 从奇数位开始。

然后我们发现支持每一次求一遍马拉车,所以复杂度就是 \(\mathrm O(nq)\)

T5. P7603

折半报警器。

注意到 \(x \le n \le 10^5\),所以每一次闹鬼至多会修改 \(6\) 个位置的值。

根据抽屉原理可得若 \(\sum_{1 \le i \le k} a_i \ge y\),则一定存在一个 \(a_i \ge \lceil \frac{y}{k} \rceil\)。那么此时我们考虑给这个集合里面的所有数塞一个大小为 \(\lceil \frac{y}{k} \rceil\) 的报警器。如果一个监控器中的某一个报警器报警了,那么我们就考虑直接暴力去查看这个监控器会不会报警,但是我们肯定不能接受这个复杂度。

我们发现我们只要有一个报警器报警了,那么我们在之后的每一次修改都需要暴力检查一遍,这样是不优的。所以考虑当一个报警器报警后,看当前是否会让这个监控器报警,否则计当前闹鬼次数的和为 \(s\),然后重新塞进来一个 \(\lceil \frac{y - s}{k} \rceil\) 的报警器。

时间复杂度为 \(\mathrm O(k^2 \log V \log q)\)

T6. CF2066E

考虑两个水量相等的水桶,如果他们测出来重量不一样,那么较重的那一个是有毒的,否则这两个水桶内的水就是可以随便倒的。

此时考虑记录一个值 \(L\) 表示目前我们可以随便倒的水的水量。那么我们发现所有的操作都可以归约为一下两种:

  • 选择一个 \(a_i \le L\):就是用 \(L\) 去装一个水量为 \(a_i\) 的桶去和 \(a_i\) 比,如果是一样重的那么 \(L \gets L + a_i\)

  • 选择一个 \(a_i + L \ge a_j\):往 \(a_i\) 内倒 \(a_j - a_i\) 的水然后再和 \(a_j\) 比较,如果一样重那么 \(L \gets L + a_i + a_j\)

此时发现我们最开始的第一个操作可以视为 \(L = 0\),然后选择两个相同重量的桶去做 \(2\) 操作。然后我们一直进行上面两个操作,直到我们可以确定 \(n - 1\) 个桶内没有毒药为止。

考虑用值域分块来优化这个过程。那么就是将 \([2^i,2^{i+1})\) 内的数分成一个块。此时我们发现两个操作后都一定会比这个块内的最大值要大,所以如果我们确定了某一块内任意一个桶没有毒药,那么就可以确定一整块所有的桶是否有毒药。

然后我们发现对于一个块 \(S\) 能否有一个被确定的条件为 \(L \ge \min \limits_{x \in S} a_x\) 或者 \(L \ge \min \limits_{x \in S,y \in [1,n]} (|a_x - a_y|)\)。那么我们只需要对于每一个块都再维护一个相邻两个数的差即可。

T7. P9545

先把最大流转成最小割,那么考虑令 \(f(S,T)\) 表示起点集合为 \(S\),终点集合为 \(T\) 的最小割,那么很明显 \(f(S,T) = \sum_{u \in S,v \in T} e_{u,v}\),其中 \(e_{u,v}\) 表示 \(u \to v\) 的有向边是否存在。

此时发现 \(f(S,T) + f(T,S) = |S| \times |T|\)。而同时又发现,对于一条边如果他对 \(S\) 的贡献为 \(1\),那么它对于 \(T\) 的贡献就是 \(-1\),所以 \(f(S,T) - f(T,S) = \sum_{u \in S} out_u - in_u\)。又因为 \(|S|\) 相同,所以我们考虑贪心的去取 \(S\) 即可。

T8. P7564

很牛的题目。

考虑把所有人看成一条从(出发时间,出发位置)到(终止时间,终止位置)的线段,那么每个用户就是一条从 \((t_i,a_i)\)\((t_i + |a_i - b_i|,b_i)\) 的线段。而每个保安就是一个起点为 \((p_i,x_i)\) 每次可能会向右上或者右下走。那么保安和用户一起走的时间就是这两条线段重合的路程。

此时你发现所有线段要么是和 \(y = x\) 平行的,要么是和 \(y = x\) 垂直的。那么考虑把整个坐标系旋转 \(45^\circ\),即 \((x,y)\) 变成 \((x - y,x + y)\)。那么此时所有的线段的长度都是原本的 \(2\) 倍,那么此时一个保镖获得的报酬就是一起走的路程 \(L\) 再乘上 \(\frac{c_i}{2}\)

由于 \(n\) 很小所以考虑把用户线段的起点和结尾作为关键点离散化一下,得到 \(\mathrm O(n^2)\) 个节点。然后对于每个节点考虑处理出当每个保镖走到这里之后可以获得的最大收益是多少。然后到格点前的最大价值可以使用李超线段树维护。

T9. P7723

等价类分治。

考虑称 \(f(m)\)\(m\) 条线把平面分成了多少个部分,每一个部分都是一个等价类,进行相同的操作。然后考虑建出一个类似线段树的结构,对于每一个等价类建一个节点,这个节点的儿子是等价类内的所有点,维护的信息即合并子节点信息。

接下来考虑对于时间进行分治。对于较早的操作,只有 \(f(\frac{m}{2})\) 个等价类。由于每一个等价类都是上一层的若干个等价类的并,那么我们对每个新等价类建立一个节点,儿子是上一层的等价类。

\(m = 1\) 的时候,我们就得到了我们想要操作的等价类了,那么直接打 tag 即可。

T10. P11149

\(dp_{u,j}\) 表示在以 \(u\) 为根的子树内,选择的颜色为 \(a_u,j\) 的联通块个数。

特别的 \(dp_{u,a_u}\) 表示只有 \(a_u\) 这一种颜色的情况。

接下来考虑转移:

  • \(a_u = a_v,v \in \text{son}(u)\)

对于所有的 \(i \in [1,n]\) 有:

\[dp_{u,i} = dp_{v,i} \times dp_{u,a_u} + dp_{v,a_v} \times dp_{u,i} + dp_{v,i} \times dp_{u,i} + dp_{u,i} \]

特别的:

\[dp_{u,a_u} = dp_{u,a_u} \times (dp_{v,a_v} + 1) \]

  • \(a_u \neq a_v,v \in \text{son}(u)\)

\[dp_{u,a_v} = dp_{u,a_v} \times (dp_{v,a_v} + dp_{v,a_u} + 1) + dp_{u,a_u} \times (dp_{v,a_v} + dp_{v,a_u}) \]

然后直接线段树合并即可。

T11. P8114

待补。

T12. P7451

考虑线性基。

将每一个数是否拥有一个质数的计数次幂用一个二进制表示,然后考虑将其插入一个线性基中,假设此时的自由元数量为 \(x\),则此时的答案就是 \(2^x\)

但是注意到 \(\pi(R)\) 比较大,所以会超时。但是我们注意到经典结论,即每一个数至多拥有 \(1\)\(\ge \sqrt R\) 的质因数至多只有一个,所以这启示我们根号分治。

对于 \(\le \sqrt R\) 的质数,直接按照前面的做法,将其看成一个二进制位,然后用 bitset 去优化线性基即可。否则,我们注意到只会至多出现 \(R - L + 1\) 个质数,此时如果每次遇到某个质数才建立某个线性基,那么建出的线性基数量很少。

但是这样依然无法通过。

此时我们发现如果一个质数 \(\ge 2 \times \sqrt R\) 的话,那么如果这个质数出现了,就一定会在线性基里,所以对于这一类的质数直接暴力做即可。

T13. qoj14729

假如存在一个数 \(x\)\(a,b\) 中总共出现奇数次,那么必定无解。

注意到交换 \(a_x\)\(b_x\) 是不需要代价的,所以发现一个数出现在 \(a\) 还是 \(b\) 并不重要。所以对于一个数字 \(x\),我们可以发现将 \(x\) 所有出现的位置排序后两两配对是最优的,所以我们可以得到一个理论下界:

\[\sum_x \sum_{i = 1}^{\frac{sum_x}{2}} pos_{x,2 \times i} - pos_{x,2 \times i - 1} \]

接下来考虑构造:假如 \(a_1 = x,b_1 = y\),设第二个 \(x,y\) 分别在 \(p_x,p_y\)。假设 \(p_x < p_y\) 则交换 \(b_1\)\(a_{p_x}\),否则交换 \(a_1\)\(b_{p_y}\)。然后我们就把问题转换为了 \(a[2:n],b[2:n]\) 的一个子问题了。

然后随便坐。

T14. P14662

首先有经典结论:

\[\oplus_{i = 1}^n i = \left\{\begin{aligned} n \space (n \equiv 0 (\bmod 4)) \\ 1 \space (n \equiv 1 (\bmod 4)) \\n+1 \space (n \equiv 2 (\bmod 4)) \\0 \space (n \equiv 3(\bmod 4)) \end{aligned}\right. \]

这提示我们考虑对于 \(n \bmod 4\) 的余数取模。

  • \(n \bmod 4\)\(1\)

则此时 \(\oplus_{i = 1}^n i = 1\),先把 \(n = 1\) 特判掉。

接下来考虑将 \(1\) 分在第 \(1\) 组,将 \(2,3\) 放在第 \(2\) 组,然后把剩下的数放在第 \(3\) 组,此时发现每一组的数的异或和均为 \(1\)。然后组间连边,组内不连边即可。

  • \(n \bmod 4\)\(3\)

此时 \(\oplus_{i = 1}^n i = 0\)。则考虑把 \(1\) 分在第 \(1\) 组,剩下的数放在第 \(2\) 组。然后连一个菊花即可。

  • \(n \bmod 4\)\(2\)

此时 \(\oplus_{i = 1}^n i = n + 1\),需要先把 \(n = 2\) 无解判掉。

根据前两种方式的提示,考虑将 \(1 \sim n\) 的数分成异或和相同的 \(3\) 组。则考虑将 \(1,n\) 放在第 \(1\) 组,\(2,n-1\) 放在第 \(2\) 组,剩下的数放在第 \(3\) 组。这样子三组的异或和均为 \(n + 1\)。然后组间连边即可。

  • \(n \bmod 4\)\(0\)

此时 \(\oplus_{i = 1}^n i = n\)。需要将 \(n = 2^k\) 无解判掉。

我们还是考虑将 \(1 \sim n\) 分成异或和相同的 \(3\) 组。首先先将 \(n\) 分在第一组,然后将所有的 \(2^k \in n\) 分在第二组,则此时第二组的异或和也为 \(n\),所以直接将剩下的数分在第 \(3\) 组即可。同样组间连边即可。

T15. P14459

先考虑如何判断一个序列 \(a\) 是否为神秘的。

我们注意到如果序列最后在边界剩下了 \(1\) 和一堆别的数,那么这个序列一定是神秘的,所以当 \(a_1 = 1\) 或者 \(a_n = 1\) 的话就一定是神秘的。但是有一个特例就是序列全为 \(1\)\(n\) 是奇数。这个性质提醒我们可以考虑去在边界去构造 \(1\) 来确定是否为神秘的。

假设 \(a_1 \neq 1,a_n \neq 1\),如果此时注意到如果存在一个数在 \([2,n-1]\) 之间,我们就一定可以把其放到 \(a_1\) 并且变成 \(1\)。因为 \(a_n \neq 1\),所以操作完的序列就一定不会出现全是 \(1\)\(n\) 是奇数的情况。所以如果有数在 \([2,n-1]\) 之间,这个序列就一定是神秘的。

剩下的情况就是 \(a_i\)\(1\)\([n,m]\) 组成的。由于 \([n,m]\) 之间的数不可能被消成 \(1\),则在此记为 \(+\infty\)。同样的如果 \(a_1 = 1\) 或者 \(a_n = 1\) 则这个序列就一定是神秘的。首先我们注意到如果一个序列全是 \(+\infty\),那么我们是不可能将这个序列消完的,因为这些数都不可能变成 \(1\),所以最后一定会剩下一个数。如果存在 \(i \in [2,n)\),且 \(a_i = 1,a_{i + 1} = 1\),则可以考虑将 \(a\) 分成 \(a[1:i]\)\(a[i+1:n]\) 两个序列看待,此时这两个序列均有 \(1\) 在边界,所以 \(a\) 就是神秘的。否则这个序列始终保持 \(a_1 = +\infty,a_n = +\infty\) 且没有两个相邻的 \(1\) 的情况,此时这个序列一定是不神秘的。但是需要考虑序列全为 \(1\)\(n\) 为奇数的情况。

接下来考虑计数。利用容斥的思路,将求神秘序列的数量转化为求非神秘序列的数量。考虑定义 \(dp_{i,0/1}\) 表示考虑了 \(i\) 个数,第 \(i\) 个数填的的是 \(1\) 还是 \(+\infty\)。此时需要注意填 \(+\infty\)\(\max(m - n + 1,0)\) 中可能。然后直接转移即可。

T16. qoj833

假设 \((1,1)\)\((n,m)\) 不连通,则答案为 \(\dbinom{c}{2}\),其中 \(c\) 为空地数量。

此时注意到一个关键性质,每一条路径上的所有点的横坐标和纵坐标之和必定各不相同。即每条路径会和 \(x+y=2\)\(x+y=n+m\)\(n+m-1\) 条线各相交一次。

此时考虑维护极左路径和极右路径。所以我们需要堵上的点一定有一个在极左路径上,此时考虑去枚举这个点,设为 \((x,y)\)。如果这个点也在极右路径上,那么第二个点随便堵即可。否则我们需要去找到新的极左路径,由于新的路径也一定有一个点和 \((x,y)\) 在同一条直线上,所以考虑枚举 \(k\) 来求出最小的 \(k\) 使得 \((x-k,y+k)\)\((1,1),(n,m)\) 都联通。则将 \((x-k,y+k)\)\((1,1)\)\((n,m)\) 这两条路径并起来就是新的极左路径了,而这条新路经和极右路径的交点就是第二个点可以的的位置。

T17. qoj850

是不是他们 div1 模拟赛题来着。

考虑定义 \(dp_{i,j}\) 表示第一个串匹配到了第 \(i\) 个字符,第二串匹配到了第 \(j\) 个字符。转移是简单的。注意到当 \(i - j\) 变化的时候,dp 值一定会 \(+1\)。所以我们可以考虑按照 \(i - j\) 去分类。

Lemma:当 \(dp_{i,i + \delta} = dp_{j,j + \delta}\)\(i < j\) 时,从 \(dp_{j,j + \delta}\) 转移一定比 \(dp_{i,i + \delta}\)

Proof:考虑将这个 \(dp\) 放到网格图上,此时假设经过 \((i,i + \delta)\) 的路径到达 \((\ge j,\ge j + \delta)\) 这个区间的第一个点为 \((k,j + \delta)\),则 \((i,i + \delta)\)\((k,j + \delta)\) 的距离至少为 \(|i - k|\),而 \((j,j + \delta)\)\((k,j + \delta)\) 的距离就是 \(|j - k|\)。因为 \(i < j\) 则从后面的点转移会更优。

所以从 \((1,1) \to (n,m)\) 的路径上只有 \(\mathrm O(k^2)\) 个点是有用的,然后用二分+哈希去维护 \(S,T\) 任何两个位置的 lcp 即可做到 \(\mathrm O(k^2 \log n)\)

T18. CF1720D2

我不会的找性质题,温习一下。

注意到 \(a_i \oplus j < a_j \oplus i\),则必定存在一个 \(k\) 使得 \(a_i \oplus j\)\(a_j \oplus i\) 的前 \(k\) 位是相同的。而此时 \(a_i \oplus i\)\(a_j \oplus j\) 的前 \(k\) 位也是相同的。同时,假设 \(i\) 的第 \(k + 1\) 位为 \(u\)\(a_{i + 1}\) 的第 \(k + 1\) 位为 \(v + 1\),则满足 \(a_i \oplus j < a_j \oplus i\)\(j\)\(a_j\) 分别满足其 \(k + 1\) 位为 \(v \oplus 1\)\(u\)

于是我们可以考虑将 \(a_i \oplus i\) 插入 Trie 中,然后在插入的时候边插入边转移即可。

T19. CF2183F

怎么这种题都不会。

出现次数的平方可以看成选择两个相同的字符串并且可以重复的数量。那么设 \(dp_{i,j}\) 表示两个字符串的起点分别为 \(i,j\) 最后选出的字符串 \(t_1 = t_2\) 的方案数量。若 \(s_i \neq s_j\),则 \(dp_{i,j} = 0\)。否则:

\[dp_{i,j} = 1 + \sum_{x \in \text{subtree}(i),y \in \text{subtree}(j)} dp_{x,y} \]

注意到一个子树内的的 dfn 序是连续的,所以直接按照 dfn 序从大到小去 dp 即可。

T20. CF1768F

牛牛题。

考虑选择直接从 \(i \to j\) 什么是比一步一步走更优。

\[\min^j_{k = i} a_k \times (i-j)^2 \le (i - j) \times n \]

右边是一个代价的上界。所以可以得到:

\[\min^j_{k=i} a_k \le \frac{n}{i - j} \]

其次我们可以发现,如果直接从 \(i \to j\) 是最优的,那么一定不存在 \(k \in (i,j)\) 使得 \(a_k = \min_{l = i}^j a_l\)。因为如果存在的话,那么先从 \(i \to k\) 在从 \(k \to j\) 肯定比直接从 \(i \to j\) 更加优秀。

接下来考虑按照 \(\min_{k = i}^j a_k\) 的大小分类:

  • \(\min_{k = i}^j a_k > \sqrt n\)

所以 \(j - i \le \sqrt n\),此时 \(j\) 的数量很少,可以直接暴力枚举。

  • \(\min_{k = i}^j a_k \le \sqrt n\)

假如最小值取在 \(a_i\),那么维护一个单调栈,里面放的是所有满足 \(\min_{k = i}^j a_k \le \sqrt n\)\(i\)。因为单调栈内的数互不相同,则栈的大小一定小于 \(\sqrt n\)。所以直接暴力转移即可。否则可以直接忘右扫,直到 \(a_i \le a_j\),由于每一个数至多会扫整个序列 \(1\) 边,所以复杂度依然为 \(\mathrm O(n \sqrt n)\)

T21. P9084

笛卡尔树计数,完全不会啊。

我们注意到每一次至少删除一半的点,所以如果 \(k \ge \log_2 n\) 的话,那么答案就是 \(0\)。同时我们发现每一次操作实际上是把所有儿子个数 \(< 2\) 的节点删除。但是需要注意 \(1\)\(n\) 需要没有儿子才会被删除。

接下来考虑对于有这种性质的笛卡尔树计数。考虑令 \(dp_{i,j,0/1}\) 目前的子树大小为 \(i\),需要进行 \(j\) 次操作才能删完,并且有没有出现第 \(1\) 或者第 \(n\) 个数。

接下来考虑转移。如果最后一次删除只删除了根节点,那么可以得到:

\[dp_{i,j,0} = \sum_{k = 0}^{i - 1} dp_{k,j - 1,0} \times dp_{i - k - 1,j - 1,0} \times \dbinom{i - 1}{k} \]

否则我们可以得到:

\[dp_{i,j,0} = \sum_{k = 0}^{i - 1} 2 \times dp_{k,j,0} \times \dbinom{i - 1}{k} \times (\sum_{l = 0}^{j - 1} dp_{i - k - 1,l,0}) \]

接下来考虑 \(dp_{i,j,1}\) 如何转移。同样的对于最后一次是不是只删根节点分类。如果之删根节点则:

\[dp_{i,j,1} = \sum_{k = 0}^{i - 1} dp_{i - k - 1,j - 1,0} \times (\sum_{l = 0}^{j - 1}dp_{k,l,1}) \times \dbinom{i - 1}{k} \]

否则:

\[dp_{i,j,1} = \sum_{k = 0}^{i - 1} dp_{k,j,1} \times (\sum_{l = 0}^{j - 1} dp_{i - k - 1,l,0}) \times \dbinom{i - 1}{k} \]

最后直接枚举两个两个子树的大小即可。

一定要特判 \(m\) 是否大于 \(\log_2 n\),不然复杂度是假的。

T22. qoj5519

考虑令 \(w_i,b_i\) 分别表示前 \(i\) 个字符中 \(w,b\) 的数量。此时假设前 \(i\) 个点和后 \(n - i\) 个点之间连了 \(x\) 条边。因为在哈密顿回路中每个点的度数是 \(2\),所以前 \(i\) 个内就有 \(\frac{2i-x}{2}\) 条边。而前 \(i\) 个点内最多有 \(\min(w_i,b_i)\) 个点,所以我们可以得到 \(w \ge 2|w_i - b_i|\),又因为 \(w\) 不为 \(0\) 且为偶数,所以我们可以得到 \(w \ge \max(2|w_i - b_i|,2)\)。此时我们考虑刻画取到下界的路径的形态:

  • \(w_i = b_i\),则有一条形如 \(WBWBWBWB....WB\) 的路径。

  • \(w_i > b_i\),则有 \(w_i - b_i\) 条形如 \(WBWBWB....WBW\) 的路径。

  • \(w_i < b_i\),则有 \(b_i - w_i\) 条形如 \(BWBWBW....BWB\) 的路径。

接下来考虑计数。令 \(dp_i\) 表示前 \(i\) 个点组成的不同路径组的数量,那么我们有转移:

  • 假设 \(w_i > b_i\):若加入 \(w\) 则它单独成为一条路径,则 \(dp_i \gets dp_{i-1}\)。若 \(w_i = b_i + 1\),则我们可以在路径的首尾加入 \(B\),所以 \(dp_i \gets 2\times dp_{i-1}\),否则 \(w_i > b_i + 1\),此时我们可以合并两条路径,所以 \(dp_i \gets dp_{i-1} \times (w_i-b_i)(w_i-b_i-1)\)

  • 假设 \(w_i = b_i\)\(dp_{i} \gets dp_{i - 1}\)

  • 假设 \(w_i < b_i\):和 \(w_i > b_i\) 的转移类似。

最后答案需要除 \(4\),因为路径是可以反转的,同时最后一个放在开头结尾是一样的。

T23. qoj9905

考虑一颗哈夫曼树拥有怎么样的性质。假设一个点的左节点和右节点的权值分别为 \(l_i,r_i\),此时我们钦定 \(l_i \le r_i\)。那么假如 \(\forall i,l_{p_i} \ge r_{p_{i - 1}}\) 那么该树一定可以被生成。其次就是哈夫曼树会使得 \(\sum^n_{i = 1} 2^{dep_i} \times a_i\) 最小,而这个值一定不会大于 \(2\times n \sum^n_{i = 1} a_i\)。所以点的深度会是在 \(\mathrm O(\log n + \log \max a_i)\) 这个级别。

由于深度十分小,所以我们每一次可以直接暴力修改,而每一次修改一个点的点权可能会造成 \(\mathrm O(\log n + \log \max a_i)\) 个点不符合条件,但是这个复杂度我们是可以接受的,所以暴力修改。

T24. P12204

每一个 SCC 内一定可以黑白交替染色。所以我们考虑直接缩点,然后先将入度为 \(0\) SCC 做一次黑白交替染色,然后将所有被染黑的点的后继节点删除,然后重复上述操作即可。

考虑优化这个算法。注意到如果将一个点删除,那么一个 SCC 可能会分成多个 SCC,而且分裂出来的 SCC 依然是一个二分图,但是如果此时直接黑白染色可能会让一些没有入度的点被染白。那么此时我们可以考虑直接将没有入度的点直接染黑,然后递归地删除后继,然后直接用类似拓扑排序的做法把一整个 SCC 删除后,就可以继续黑白染色了。

T25. qoj10009

同颜色是 \(\max(\Delta x,\Delta y)\),不同颜色是 \(\min(\Delta x,\Delta y)\)。所以我们注意到,如果想从一个节点 \(u\) 跳到另一个节点 \(v\),且他们是不同颜色的,那么我们直接跳过去肯定是最优的。

由于是 \(\min\) 所以我们可以把 \(x,y\) 分开来看,然后直接连边然后跑最短路即可。根据上面的结论,我们可以只连不同颜色的节点。但是如果直接连的话,复杂度是 \(\mathrm O(n^2)\) 的,考虑优化。

这里以 \(x\) 轴为例,我们可以先排个序,然后对于每一个极大连续的相同颜色块我们建一个入点和一个出点。假设第 \(i\) 极大连续的相同颜色块的左右端点分别是 \([l_i,r_i]\),出点入点分别为 \(u_i,v_i\)。那么对于每一个节点 \(j\),我们建以下四条边:

\((u_{i - 1},j,|x_j - x_{l_i}|)\)

\((j,v_{i - 1},|x_j - x_{l_i}|)\)

\((j,u_i,|x_j - x_{r_i}|)\)

\((v_i,j,|x_j - x_{r_i}|)\)

然后对着 \(y\) 轴做同样的操作即可。最后跑一边 dij 即可。

T26. P8529

半平面莫队 /jy/jy

随机选出 \(B\) 个关键点,然后每一个直线考虑将其放在离其最近的关键点上,这样子每一个关键点上就有 \(\mathrm O(\frac{n}{B})\) 个询问。此时我们发现对于每一条直线,平移会让这条直线变为 \(x \times a + y \times b + c + c^{'} = 0\),所以我们会将这条直线挂在使得 \(c^{'}\) 最小的 \(x_i,y_i\) 上。

我们把这条直线挂在关键点上,对于每个关键点将所有直线平移到原点变为 \(a\times x + b\times y = 0\),随后取直线上的点 \((b,−a)\),如果 \(b \le 0\) 那么就等于半平面旋转到了直线下。所以可以直接按照 \((b,−a)\) 的极角大小排序,此时复杂度是 \(\mathrm O(n)\) 级别,旋转到一个线的位置后,再去平移直线,期望花费为 \(\mathrm O(B \times B)\)。所以令 \(B = \sqrt n\) 的时候复杂度最优。

T27. CF1210F1

\(G_{S,T}\) 表示左部点集合为 \(S\),右部点 \(T = N(S)\) 的概率。考虑枚举 \(T\) 的每一位,算出没有和 \(S\) 中任何一点相连的概率,然后用 \(1\) 减去即可:

\[G_{S,T} = \prod_{u \in T}(1 - \prod_{v \in S}(1 - p_{u,v})) \]

接下来设 \(E_{S,T}\) 表示左部点集合 \(S\) 和右部点集合 \(T\) 没有连边的概率,这个直接算即可:

\[E_{S,T} = \prod_{u \in S}\prod_{v \in T}(1 - p_{u,v}) \]

因为 Hall 定理,所以此时我们考虑计算 \(|S| \le |N(S)|\) 的概率。但是不好算,所以考虑容斥去求 \(S > |N(S)|\) 的概率。为了防止算重,考虑令 \(\max |S| - |N(S)|\)\(|S|\) 最小的 \(S\) 设为单位元。

接下来考虑设 \(dp_{S,T}\) 表示左部点为 \(S\),右部点为 \(T\)\(|S| \le |T|\) 并且有完美匹配的概率,并设 \(g_{S,T}\) 表示左部点为 \(S\) 右部点为 \(T\)\(|S| > |T|\) 并且不存在完美匹配的概率。接下来考虑转移:

对于 \(dp_{S,T}\),考虑去枚举一个 \(S^{'}\) 属于 \(S\)\(T^{'}\) 属于 \(T\) 的二分图子集,同时 \((S^{'},T^{'})\) 存在完美匹配。因为 \(T^{'} = N(S^{'})\),所以 \(S^{'}\) 和剩下的 \(T / T^{'}\) 没有连边。又因为 \((S^{'},T^{'})\) 所以 \(S / S^{'}\)\(T / T^{'}\) 不存在完美匹配,所以转移式为:

\[dp_{S,T} = G_{S,T} - \sum_{S^{'},T^{'}} dp_{S^{'},T^{'}} \times E_{S^{'},T / T^{'}} \times g_{S / S^{'},T / T^{'}} \]

接下来考虑如何计算 \(g_{S,T}\):考虑枚举子集 \((S^{'},T^{'})\) 不存在完美匹配。则如果 \(|S^{'}| - |T^{'}| \ge |S| - |T|\),那么 \(S^{'}\) 将会成为新的代表元。同时因为 \(T^{'} = N(S^{'})\),所以 \(S^{'}\) 和剩下的 \(T / T^{'}\) 没有连边,而 \((S / S^{'},T / T^{'})\) 存在完美匹配。所以转移式为:

\[g_{S,T} = G_{S,T} - \sum_{S^{'},T^{'}} [|S^{'}| - |T^{'}| \ge |S| - |T|] g_{S^{'},T^{'}} \times \times E_{S^{'},T / T^{'}} \times dp_{S / S^{'},T / T^{'}} \]

所以直接枚举 \(S,T\) 的子集即可,时间复杂度为 \(\mathrm O(3^{2n})\)

T27. CF1270E

考虑先进行黑白染色,即 \(x_i + y_i\) 为奇数分在 \(A\) 组,否则分在 \(B\) 组。假设 \(A\) 组和 \(B\) 组内都有数,则一定满足条件,因为组内和组内的连边一定是偶数,组内和组外的连边一定是偶数。

假设全在 \(B\) 组,那么我们现在考虑将距离的平方一直除 \(2\) 直到分出奇偶,即将 \((x_i,y_i)\) 变为 \((\frac{x_i + y_i}{2},\frac{x_i - y_i}{2})\),直到不是全在同一组。如果一开始全在 \(A\) 组,那么此时不能直接除 \(2\),我们可以考虑将 \((x_i,y_i) \to (x_i + 1,y_i)\) 后再重复上述操作。

此时我们可以证明在 \(\mathrm O(\log A)\) 次操作后一定会分出两组。

T28. CF611H

完全不会证咋克的结论,所以口糊一下得了。

考虑将所有十进制下位数相同的点缩成一个点。那么在经过这个操作后总点数 \(\le 5\)

接下来考虑如何去判是否无解。假设足对于所有缩出来的点的子集的点的个数 \(>\) 子集内边的个数,那么存在一组解。

接下来考虑构造。我们每一次考虑去删叶子结点,然后直接暴力判断删完后是否会导致无解,如果不会,那么直接链上即可。最后在原图上,我们在每一个缩玩点的集合内会剩下 \(1\) 个点,这个点单独处理即可。

T29. CF750G

先考虑不分叉的情况。

假设当前在节点 \(x\),接着的链长为 \(h\),则这条链上所有数的和因该在 \([(2^{h + 1} - 1)x,(2^{h + 1} - 1)(x + 1) - h]\) 这个区间内。由于对于一个 \(h\) 只存在一个 \(x\),所以考虑去枚举 \(h\) 然后解出对应的 \(x\)。接下来考虑如何确定是否有解。对于一个子树深度为 \(d\) 的儿子从左儿子变为右儿子的贡献为 \(2^d - 1\)。则假设我们最开始全部选左儿子,那么我们需要做的就是看能否做到用 \(2^1 - 1,2^2 - 1,2^3 - 1,\cdots,2^h - 1\) 凑出一个 \(s - (2^{h + 1} - 1)x\)。由于 \(2^l - 1 \ge \sum \limits_{i = 1}^{l - 1} (2^i - 1)\),所以我们可以直接从大到小贪,如果最后得到了 \(0\),那么就是可以。

接下来考虑分叉的情况。假设左脸的长度为 \(h_1\),右链的长度为 \(h_2\),则链上所有数的和的范围为 \([(2^{h_1 + 1} - 1 + 2^{h_2 - 1} - 2)x + 2^{h_2} - 1,(2^{h_1 + 1} - 1 + 2^{h_2 - 1} - 2)x + 2^{h_2} - 1 + 2^{h_1} - h_1 - 1 + 2^{h_2} - h_2 - 1]\)。同样的,对于 \(h_1,h_2\) 我们有唯一的 \(x\),所以我们现在的任务依然是有多少种从 \(2^1 - 1,2^2 - 1,2^3 - 1,\cdots,2^{h_1 - 1} - 1\)\(2^1 - 1,2^2 - 1,2^3 - 1,\cdots,2^{h_2 - 1} - 1\) 中选出若干个数可以凑出一个 \(s - (2^{h_1 + 1} - 1 + 2^{h_2 + 1} - 2)x\)。假设 \(t = s - (2^{h_1 + 1} - 1 + 2^{h_2 + 1} - 2)x - 2^{h_2 + 1} - 1\),那么此时问题就被我们转化为了假设我们选择了 \(n\) 个数,求 \([i < h_1] + [i < h_2]\)\(i\) 凑出 \(t + n\) 的方案数。

对于这个问题,我们设 \(dp_{i,j,0/1}\) 表示前 \(i\) 位填好了,选了 \(j\) 个数,对 \(i+1\) 是否产生进位,此时直接转移就可以做到 \(\mathrm O(\log^3 V)\),考虑优化。我们注意到 \(t\) 是确定的,而当 \(n \to n + 1\) 的时候我们需要重新做一遍,而 \(t + n \to t + n + 1\) 的变化位数不多,所以我们可以考虑令 \(dp_{i,j,k}\) 表示只有前 \(i - 1\) 位没填好,选了 \(j\) 个数,前 \(i - 1\) 个数需要向 \(i\) 进没进位,然后每一次 \(n \to n + 1\) 的时候只需要修改前缀即可,此时复杂度就做到了 \(\mathrm O(\log^2 V)\)

最终复杂度为 \(\mathrm O(\log^4 V)\)

T30. qoj13129

抽象题。

\(a_i = b_i\) 时,先后手去操作这个矩形肯定没有任何好处。而当 \(a_i > b_i\) 的时候,先手去操作这个矩形可能会有一定优势,现在我们考虑这个优势有多大。

假设 \(a_i,b_i\) 的最大二进制相同时,这个矩阵对于双方都没有优势。考虑用归纳法证明,因为无论谁在上面操作了一次,都必然会留下至少一个对对方有利的矩形,从而对方可以轻松地跟一步,而剩下的矩形对自己仍然没有益处。所以设 \(\text{high}(x) = \max\{2^k|2^k \le x\}\),则当 \(a_i > b_i\) 的时候,这个矩阵就可以给先手多带来 \(\lfloor \frac{a_i}{\text{high}(b_i)} \rfloor\) 步的优势,最后看谁优势更大即可。

T31. AT_agc057_d

观察性质好题。

考虑 \(|A|\) 的最大值。可以先将 \(x + y = S\)\(x,y \in [1,S)\)\((x,y)\) 分在一组,这样子可以分出 \(\lfloor \frac{S - 1}{2} \rfloor\) 组,而每一组最多选出 \(1\) 个数,所以 \(|A|\) 的最大值为 \(\lfloor \frac{S - 1}{2} \rfloor\)。并且我们一定可以取到这个上界,考虑令 \(A = \{\lfloor \frac{S - 1}{2} \rfloor + 1,\lfloor \frac{S - 1}{2} \rfloor + 2,\cdots,S\}\) 即可。

上面的分组给了我们一个启示就是考虑将所有数分成 \(\le \lfloor \frac{S - 1}{2} \rfloor\)\(> \lfloor \frac{S - 1}{2} \rfloor\) 两组。所以我们考虑令 \(B = \{x|x \in A,x \le \lfloor \frac{S - 1}{2} \rfloor\}\)。则当 \(a,b \in B\)\(a + b \le \lfloor \frac{S - 1}{2} \rfloor\) 的时候,我们一定有 \(a + b \in B\),因为我们需要在 \((a + b,S - a - b)\) 这一组内选出一个数,而如果选出 \(S - a - b\) 的话,那么 \(S - a - b,a\)\(b\) 这三个数就可以凑出 \(S\)

更进一步的,假设 \(B\) 集合是合法的,则 \(A\) 集合同样合法。考虑反证,假设存在一个数 \(x \in A\),且可以通过 \(x\)\(B\) 集合内的数凑出 \(S\),则 \(S - x \le \lfloor \frac{S - 1}{2} \rfloor\) 且可以使用 \(B\) 内的数凑出 \(S - x\),所以根据上一个结论可得 \(S - x \in B\)\(S - x \notin B\)(因为最开始说了,\(x\)\(S - x\) 中有且仅有一个在集合 \(S\) 内)矛盾了,所以假设 \(B\) 集合是合法的,则 \(A\) 集合同样合法。

接下来考虑最小化 \(B\) 的字典序。那么贪心的去做,从小到大考虑每个元素,如果加入后依然合法就假如并且将所有 \(\le \lfloor \frac{S - 1}{2} \rfloor\) 子集和加入 \(B\)。此时发现第一个被加入 \(B\) 的数为最小的 \(p \nmid S\)\(p\),所以 \(\operatorname{lcm}(1,2,\cdots,d-1) \mid S\),根据 \(S\) 的范围可得 \(p \le 43\)

假设接下来加入的数为 \(x\),则我们会将 \(x + p,x + 2p,x + 3p \cdots\) 都加入 \(B\),看到这个形式可以考虑同余最短路。考虑令 \(dp_i\) 表示用当前的数可以表示出来的最小的模 \(p\)\(i\) 的数,则当我们知道 \(dp_i\) 后,集合 \(B\) 中小于等于 \(k\) 的数的个数就是 \(\sum \limits^{p-1}_{i=0} \lfloor \frac{k-dp_i}{p} \rfloor + [i > 0]\)。所以当我们得出 \(dp_i\) 之后可以使用二分来求答案。那么现在的问题就是怎么求 \(dp_i\)

假设当前加入的数为 \(x\),令 \(v = x \bmod p\),那么只有 \(x < dp_v\) 的时候我们才会考虑去更新,加入后 \(B\) 合法的充要条件是用 \(x\) 更新数组后仍满足 \(dp_{S \bmod p} > S\)。而更新就是:

\[dp_{(v + iv)\bmod p} \gets dp_v + iv \]

更新完一轮后直接枚举每个 \(x \bmod p\) 算出最小的 \(x\),取出所有可能的 \(x\) 中最小的一个加入即可。

T32. P8258

假设我们目前在 \(u\) 进行了一次操作,则在进行一次操作之后 \(u\) 的权值就 \(\times -1\),所以我们可以得出最后答案的形式应该是 \(\sum \limits_{i=1}^n d_ia_i,a_i \in \{-1,1\}\)。所以在这个时候我们可以直接 \(ans \gets |d_u|\),然后将和 \(u\) 相连的边和 \(u\) 本身删去,此时分离出来的连通块每一个都是独立的,可以直接递归解决。

所以我们就得到了一个 \(\mathrm O(2^nn)\) 的做法:令 \(dp_S\) 表示当前还剩下的点集为 \(S\) 的答案,然后每一次转移直接枚举 \(u \in S\) 即可。接下来考虑优化。

我们发现对于节点 \(u\),他的贡献只能给到 \(fa_u,u,son(u)\),所以对于三种情况我们分别设计一种 \(dp\)

  • \(dp_{u,0/1}\):节点 \(u\) 贡献到了 \(fa_u\) 并且 \(a_{fa_u} = 1 / -1\)\(u\) 子树内的最大价值。

  • \(g_{u,0/1}\):节点 \(u\) 贡献给了自己并且 \(a_u = 1 / -1\)\(u\) 子树内的最大价值。

  • \(h_{u,0/1}\):节点 \(u\) 贡献给了节点 \(v \in son(u)\) 并且 \(a_v = 1 / -1\)\(u\) 子树内的最大价值。

接下来考虑转移:

  • \(dp_{u,0/1}\)\(fa_u\) 一定比 \(son(u)\) 操作的要早且 \(son(u)\) 的贡献没有要求。

  • \(g_{u,0/1}\)\(u\) 一定是邻域中操作最早的点。对于 \(v \in son(u)\),其贡献不能给到自己,因为无论 \(u\) 先操作还是 \(v\) 先操作都有问题,所以 \(v\) 的贡献要么给到 \(u\) 要么给到 \(son(v)\)

  • \(h_{u,0/1}\)\(v \in son(u)\) 的贡献只能给到 \(v,son(v)\),而对于 \(v \neq v^{\prime} \in son(u)\) 其贡献没有要求。

然后直接转移即可做到 \(\mathrm O(n)\)

T33. P11803

给每一个极大连通块都找一个代表元 \(u\) 表示深度最浅的节点,然后每一操作就在这个节点上打 tag。但是我们发现当更改了一条链的颜色之后有可能错误地继承或丢失祖先的 tag。此时我们可以考虑在每一次更改链的颜色时直接将 \(1 \sim u\)\(1 \sim v\) 这两条路径上的点的 tag 全部放到 \(u,v\) 以下。

此时我们可以考虑用重链剖分,在在下放 tag 的时候只有换重链了才考虑贡献即可。而我们设计的 tag 就是形如 \((c,w)\) 表示如果为颜色 \(c\),则权值增加 \(w\)。在第一次假如这个 tag 的时候,我们在重链上的极长同色段里的每个点都加上 tag,这样子重链内部的 tag 第一次就下放完了。

但是假设在每一次下放 tag 的时候链头的父亲主动给他的所有儿子下放 tag,那么复杂度肯定爆炸。此时我们可以考虑每一个轻儿子向他的父亲要权值,即记 \(f_{c,u}\) 表示节点 \(u\) 向其父亲要了多少颜色为 \(c\) 的点权,然后动态维护这个 \(f_{c,u}\) 即可。

然后对于每一个重链开一个 ODT,对于每一个颜色开一颗线段树去维护 tag,最后用 BIT+dfn 序求答案即可。

T34. AT_abc398_g

题目要求没有奇环,所以需要保证一直是二分图。二分图的判定很明显就是使用黑白染色。那么此时我们可以考虑先对整张图进行黑白染色。假设染完色之后存在 \(x\) 个黑点,那么至多可以连 \(x \times (n - x) - m\) 条边。假设这个数是奇数则先手获胜,否则后手获胜。由于 \(m\) 是确定,则考虑 \(x \times (n - x)\) 的奇偶性。

假设此时 \(2 \nmid n\),则 \(x \times (n - x)\) 必定是偶数,因为 \(x\)\(n - x\) 内一个奇数一个偶数。所以这个情况直接特判即可。

接下来考虑 \(2 \mid n\) 的情况。假设黑点和白点个数均为奇数,一个奇数一个偶数,均为偶数的极大连通块数量为 \(oo,eo,ee\)。但是我们需要特别注意,只有一个节点的连通块需要拎出来,设其个数为 \(one\)

接下来我们考虑两个连通块连起来的情况:\(ee\) 连上后没有影响,\(oo\) 连上后会使得 \(ee \to oo,oo \to ee\)\(eo\) 连上后可以使得 \(oo/ee \to oe,oe \to oo/ee\)

接下来进行分类讨论:

由于 \(eo\) 的转换方式有点多,所以考虑先令 \(eo = 0\)。此时假设 \(y = 0\),则 \(x\) 的奇偶性和 \(oo\) 奇偶性相同,所以直接考虑 \(oo - m\) 的奇偶性即可。假设 \(y \neq 0\),则 \(y\) 一定时偶数。又因为每两个孤立点都和一个 \(oo\) 相同,所以我们可以考虑 \(oo + \frac{y}{2} + m\) 的奇偶性。此时先手无法改变这个奇偶性,因为如果先手取掉一个 \(oo\),则后手也可以对应的去掉一个 \(oo\),去掉一个孤立点可以再去一个孤立点然后将其当成一个 \(oo\) 看,所以此时先手必输。同理如果 \(oo + \frac{y}{2} + m\) 是奇数,则先手必胜。

接下来假设 \(eo = 1\),则 \(y \nmid 2\),我们可以选择给 \(eo\) 加上一个孤立点变成 \(ee\) 或者 \(oo\),而这两个数的奇偶性肯定不同,所以先手可以随便操控,所以先手必胜。

此时我们发现上面这一步是先手一步就将 \(eo\) 消掉了,同理假设 \(eo = 2\) 先手也能一步消掉,所以先手同样必胜。

接下来考虑 \(eo \ge 3\),此时先手无法一步消掉。而双方肯定都不想先去操作 \(eo\),所以在 \(eo\) 操作之前所有能连的边都连上了,而在此时我们发现 \(eo\) 和孤立点已经没有区别了,于是将孤立点放入 \(eo\) 考虑。而因为 \(eo\) 的总点数是奇数,所以 \(eo\) 二分图内可连的边总是偶数。所以谁先去操作 \(eo\) 谁就会输,所以这个情况的时候当 \(m\) 是奇数的时候先手获胜,否则后手获胜。

T35. AT_agc044_d

编辑距离这个操作不好描述,所以我们可以考察一下特殊字符串上编辑距离的一个性质:

  • 假设查询 \(S\) 和由同一个字符组成的长度为 \(128\) 的一个字符串求编辑距离,则这个字符在 \(S\) 内的出现次数就是 $128 - $ 查询出来的数。

  • 假设查询 \(S\) 和另一个字符串 \(T\) 的编辑距离为 \(|T|\),则说明 \(T\)\(S\) 的子串。

首先根据第一个性质,我们可以用 \(62\) 次询问来求出每一个字符在 \(S\) 中的出现次数和 \(|S|\)。接下来考虑如何复原出 \(S\)

考虑对于每一个字符分别考虑,假设当前已经确定的长度为 \(m\),需要插入 \(k\) 个字符 \(c\)。那么此时我们可以考虑二分插入的位置 \(p\),假设字符串 \(c + s_{[p+1,|s|]}\) 是答案的子串,那么 \([1,p]\) 内一定有一个 \(c\)。所以每一个字符只需要 \(\mathrm O(\log n)\) 次查询即可找到位置。

T36. P13614

首先我们可以求出 \(S,T\) 之间的最短距离。

接下来考虑用二分来求出 \(S,T\) 之间最短路上的任意一条边。具体的,考虑去二分一个边集的前缀,假设将这个前缀删掉之后 \(S,T\) 之间的最短路增加了,则这个前缀一定有一条边在 \(S,T\) 的最短路上。并且两个端点分别对应 \(S,T\) 两部分的连通块。

假设这条边为 \((u,v)\),则我们可以考虑分别以 \(u\)\(v\) 为根去跑一次 bfs,然后在 bfs 序上二分来求出 \(S,T\) 即可。

此时如果直接分析会发现你要做 \(3 \log n\) 次询问,但是其实应该是 \(\log n + \log x + \log(n - x)\) 次,因为最后会分成两棵树,一颗大小为 \(x\) 另一棵大小为 \(n - x\),而二分只需要在树里面二分即可,所以肯定跑不满。

T37. AT_agc068_e

注意到 \(y\)\(x\) 的一个置换,那么考虑连一条 \(y_i \to x_i\) 的边,显然会成为若干条欧拉回路。但是我们发现完全无法统计,因为一张图可能对应很多种不同的 \(x\)。所以现在我们考虑去构造一个双射,让一个图对应唯一的 \(x\),这样子就好计数。考虑给定一个遍历顺序:不妨按照 \(y = 1 \to n\),每一次把 \(y\) 的边走完再走 \(y + 1\) 的边,并且每次只能走 \(\ge y\) 的点。那么这样子就有唯一的欧拉回路划分了。

接下来考虑定义 \(dp_{i,j}\) 遍历完了 \([1,i]\) 开始的欧拉回路,用掉了 \(j\) 条边的权值之和,同时设计一个 \(g_{i,j}\) 表示当前走到了 \(i\) 号节点,用掉了 \(j\) 条边的边权来辅助转移。而对于 \(x_1 = k\) 这个条件,我们可以考虑倒着做,然后直接钦定最后一条边是走到 \(k\) 的即可。

T38. AT_agc055_f

对于 \(A\) 的第 \(i\) 个长度为 \(m\) 好的子序列维护一个 \(b_i\) 表示当前最大可以放 \(b_i\) 的数,初始就是 \(b_i = m\)。那么我们判断 \(A\) 是否是棒的就是从后往前扫 \(A_i\),找到最小的 \(b_j \ge A_i\),然后让 \(b_j\) 减一。这个操作其实就是类似于在第 \(j\) 个子序列放一个 \(A_i\) 进去。而在进行操作的时候 \(b\) 肯定是单调不降的。

考虑如何计数。假设我们将当前的 \(A_i\) 放到了 \(b_j\) 的位置,那么 \(A_i\) 就有 \(b_j - b_{j - 1}\) 种取值。那么我们可以考虑令 \(c_i = b_{i} - b_{i - 1}\),那么方案数就是进行 \(n \times m\) 次操作,每一次选择一个 \(i\)\(c_i \gets c_i - 1,c_{i + 1} \gets c_{i + 1} + 1\) 方案数为 \(c_i\)

此时可以考虑将其描述为一个移动小球问题。具体的,最开始的时候 \(1\) 这个位置有 \(m\) 颗球,进行 \(n \times m\) 次移动,每一次选择一个小球,并且令其向右移动 \(1\) 格。而 \(c_i\) 就是 \(i\) 格上的球的个数。

现在考虑把限制加上。考虑将移动分成两个阶段:前 \(n \times m - x\) 步和后 \(x\) 步。枚举 \(a_i\) 填到了 \(b_j\),那么要求第一阶段结束后 \(\sum \limits_{t < j} c_t \le \sum \limits_{t \le j} c_t\)。对于第 \(n \times m - x + 1\) 步,找到 \(a_i\) 在那个地方移动肯定不可能,不妨钦定就在编号最小的球上移动。

先记 \(lim\) 表示我们关心前 \(lim\) 个位置。那么考虑令 \(dp_{i,j,k,0/1}\) 表示前 \(i\) 个球,第一个节点有 \(j\) 次操作了这 \(i\) 个球,在第一阶段移动到的位置 \(\le lim\) 的球数量为 \(k\),此前存不存在第一阶段就移动了 \(t - 1\) 步的方案,这时直接转移即可。

T39. P3571

好题啊。

考虑倒过来变成每一次删叶子。因为删一个叶子不会让叶子数量变多,只会让他减少 \(1\) 或者不变。

假设当前有 \(\le k\) 个叶子,那么还需要树高次操作就可以删完。而对于 \(> k\) 个叶子的情况,我们考虑每一次都删掉最深的叶子,然后到叶子数 \(=k\) 的时候树高就尽量小。所以我们考虑设 \(c_x\) 表示深度 \(\ge x\) 的点数和,那么答案就应该是 \(\max_h h + \lceil \frac{c_{h+1}}{k} \rceil\)。然后现在问题就是怎么求这个东西。

假设最大值在 \(i\) 处取到,那么对于所有的 \(i \neq j\)\(j\),都存在 \(i + \lceil \frac{c_{i + 1}}{k} \rceil \ge j + \lceil \frac{c_{j + 1}}{k} \rceil\)。略作变形得到 \(i - j \ge \lceil \frac{c_{j + 1}}{k} \rceil - \lceil \frac{c_{i + 1}}{k} \rceil\)。然后在平面上点出 \((i,s_{i+1})\) 这些点,那么我们考虑将这个式子改写成为斜率的形式:当 \(j < i\) 时,\(\frac{s_{i+1} - s_{j+1}}{i-j} \ge -k\),当 \(i < j\) 时,\(\frac{s_{i+1}-s_{j+1}}{i-j} \le k\),不难看出这是一个上凸包的形式,所以直接对于 \((i,s_{i+1})\) 建出凸包然后计算答案即可。

T40. P14471

做不了一点。

\(t = 0\) 时经典的树上依赖背包。把 \(dfn\) 序拍下来然后就可以做到 \(\mathrm O(nk)\) 了。

假设 \(u\) 子树内在操作一的时候被选择了 \(w_u\) 个点,那么操作二在 \(u\) 上的限制就是 \(c_u - w_u\)。此时考虑将子树看为 \(dfn\) 序上的信息,设 \(s_{l_u},s_{r_u}\) 分别表示在遍历 \(u\) 前进行了多少次操作一,在遍历完 \(u\) 的子树后进行了多少次操作一,那么我们可以得出 \(w_u=s_{r_u} - s_{l_u}\)

而操作二的上界就是 \(c_u - s_{r_u} + s_{l_u}\),而我们有 \(c_u - s_{r_u} \ge c_u - t > 0\),所以我们可以把问题看成在 \(l_u\) 处选 \([0,l_u]\) 个,在 \(r_u\) 处选 \([1,c_u - s_{r_u}]\) 个。那么 dp 的时候只需要记录操作一和操作二选择了多少个,然后可以像 苹果树 一题一样用单调队列去转移。而假设操作二并没有选 \(u\),那么可以直接无脑选最长链,而由于这个函数肯定是有凸性的,所以可以决策单调性。

T41. P4228

很厉害。

假设只查根节点考虑怎么做。假设心当前到了节点 \(u\) 我们想停在 \(u\) 节点上我们就需要在 \(u\) 的两个互异儿子 \(v_1,v_2\) 中各操作一次就可以让心的位置不变。

考虑定义 \(dp_u\) 表示心当前离 \(u\) 多远。假设 \(u\) 的重儿子为 \(v\),则我们有转移:

  • 假设 \(dp_v + 1 \le siz_u - siz_v - 1\),也就是可以从重儿子里面拉上来,那么 \(dp_u = (siz_i - 1) \bmod 2\)

  • 否则 \(dp_u = dp_v + 1 - (siz_u - siz_v - 1)\)

然后我们就得到了根节点的答案。

接下来考虑使用换根 dp 来求其他节点的答案。从根节点到点 \(i\) 的路径上的点看作已经选过了,直接无视,仅需要考虑它们的子树的影响。对于路径上的节点我们当作 \(i\) 的子树考虑,然后多记录一个重儿子即可,但是如果 \(i\) 在链上的节点的重儿子的话只能选次儿子。

时间复杂度 \(\mathrm O(n)\)

T42. P8179

假设 \(t = 0\),由于每种轮胎其代价关于使用圈数是单调的,那么我们可以直接贪心的去选。

但是如果 \(t \neq 0\),第一次就不是单调的了,但是我们发现有 \((j - 1)^2\) 这个项,那么在 \(j = \sqrt t + 1\) 的时候就一定有 \(a_i + t \le a_i + b_i \times b_i \times (j - 1)^2\),而从此之后又有单调性了。

所以我们可以将所有 \(i\) 的 前 \(\sqrt t\) 次全部拎出来做一遍 dp,然后后面跑贪心即可。

T43. P9596

对于一个 \(a_i\) 假设前面有 \(j\) 个比他大的,那么需要 \(j\) 轮才能让 \(a_i\) 在正确的位置上,因为每一轮只能让一个比 \(a_i\) 大的到他的后面。所以答案应为:

\[\max^n_{i=1}(\sum^{i-1}_{j=1}[a_j > a_i]) \]

而我们此时注意到如果存在 \(i < j\)\(a_i > a_j\) 的话,那么 \(j\) 的答案肯定比 \(i\) 大,那么我们就可以在值域去做了。

那接下来的操作就很简单了。考虑倒着枚举值域,然后用一颗线段树去维护区间加,单点修和全局查 \(\max\) 的操作即可。

T44. qoj14130

这是题?

注意到深度在 \(\mathrm O(\sqrt n)\) 级别,所以所有路径的长度肯定不超过 \(\mathrm O(\sqrt n)\) 级别。

考虑维护一个 \(cnt_{v,d}\) 表示距离 \(v\) 恰好 \(d\) 条边的点数,所以我们可以在确定一个 \(v\) 之后把 \(\sum \dbinom{cnt_{v,d}}{k-1}\) 加到答案里,然后你发现可以直接开下,所以做完了。

T45. P4117

考虑分块。计每一个块的最大值为 \(mx\)

先考虑整块怎么操作,由于修改后的数之和当前修改的值有关,所以对于每一个块,我们可以考虑用并查集来维护操作完之后值相同的位置。接下来分两种情况讨论:

  • \(mx \le 2x\):对于值域在 \((x - tag_i,mx - tag_i]\) 之间的数向自己 \(-x\) 的那个数合并,然后将 \(mx \gets mx - x\)
  • \(mx > 2x\):对于值域在 \([-tag_i,x - tag_i]\) 之间的数向自己 \(+x\) 的那个数合并,然后将 \(tag_i \gets tag_i - x\)

上面是整块的,而对于散块我考虑令第 \(i\) 个数在 \(V+i\) 然后连向操作完之后的值即可。而在散块查也是一样的,查 \(V+i\) 这个位置的 siz 即可。

然后就做完了,注意一下空间。

T46. P8330

考虑根号分治。假设这个数出现次数大于 \(\sqrt n\):种类数最多 \(\mathrm O(\sqrt n)\) 个,颜色数 \(\mathrm O(n)\),直接对于每一个暴力预处理,复杂度 \(\mathrm O(n \sqrt n)\)

那么现在只剩两个 \(< \sqrt n\) 的情况了。先考虑枚举两个数,然后我们对于每一个左端点都处理另一个数出现次数 \(d = 1,2,\cdots ,B\) 的最小右端点,这个复杂度为 \(\mathrm O(n \sqrt n)\)。接下来我们可以枚举左端点,然后去考虑删掉那一个区间,此时发现删掉的区间一定是在这些点上,所以复杂度为 \(\mathrm O(n \sqrt n)\)

最后复杂度就是 \(\mathrm O(n \sqrt n)\)

T47. qoj14717

无数次交换就等于是重拍这一个子树内的 \(a_i,b_i\)。那么问题就转化为了判断两个含通配符的可重集是否相等。

考虑当前在 \(u\) 的子树内,那么考虑记 \(ca_v\) 表示在 \(u\) 子树内有多少个点的点权为 \(v\) 的点,同理计一个 \(cb_v\)。此时考虑对于 \(u\) 的子树,其满足题目中的要求的条件为:

\[\sum^n_{i=1} \max(0,ca_i - cb_i) \le cb_0 \]

\[\sum^n_{i=1} \max(0,cb_i - ca_i) \le ca_0 \]

此时我们发现两个条件中只需要满足一个另一个肯定也会满足。那么我们此时以第一个条件为例:考虑带入 \(cb_0 = siz_u - \sum \limits^n_{i=1} cb_i\),那么我们就可以把判断条件改写为:

\[\sum^n_{i=1} \max(ca_i,cb_i) \le siz_u \]

这个东西可以直接用 dsu on tree 去维护。

T48. qoj14708

容易发现可以二分,所以此时我们考虑能否在 \(T\) 时刻送完。

由于顺着做不好做,所以考虑倒着做。此时考虑枚举我们最后一次送是送到左边还是右边,然后我们发现每次船往回开,到某一岸,我一定是送这一岸没有送过的最迟的,这个是可以 \(\mathrm O(n)\) 的。

但是我们发现二分是容易去掉的,所以此时瓶颈就在排序,所以复杂度依然是 \(\mathrm O(n \log n)\)

T49. qoj14716

最开始每一个点假设被覆盖了 \(d_i\) 次,这个值可以很快用差分求出来。此时我们令 \(x_i = [d_i = k+1] - [d_i = k],y_i = [d_i = k - 1] - [d_i = k]\)。假设原本的线段为 \(I_1\),移动后的线段为 \(I_2\),则我们此时按照 \(I_1\)\(I_2\) 的位置关系来分别计算贡献:

  • \(I_1 \cap I_2 = \emptyset\):则答案的变化量就是 \(\sum_{i \in I_1} x_i + \sum_{i \in I_2} y_i\),这个是简单的。
  • \(I_1 \cap I_2 \neq \emptyset\):我们以线段向右平移为例子,那么答案变化量为 \(\sum^{l_2 - 1}_{i=l_1} (x_i + y_{i + L})\),此时我们可以考虑对于 \(x_i + y_{i+ L}\) 去求一次前缀和然后再用单调队列维护最大值即可。

T50. qoj14718

先求出 \(1\) 号点带每一个点的距,那么会和的时间应该就是 \(t = \max\{dis_{a_i}\}\)。此时记 \(dis_{i,j}\) 表示从 \(i\) 开始到 \(j\) 的最短路。那么假设 \(i,j\) 这两个人会在边 \((u,v,w)\) 上碰面当且仅当:

\[dis_{i,u} + w + dis_{1,v} \le t \]

或者:

\[dis_{j,v} + w + dis_{1,u} \le t \]

显然 \(dis_{j,v}\) 越小越好, 即只需要关心除了 \(i\) 以外第一个到达节点 \(v\) 的人所需要花费的时间。

同时如果 \(j\)\(i\) 先到达节点 \(u\)\(i\) 如果经过节点 \(u\) 再去碰面肯定不如直接在此与\(j\) 碰面。因此我们不需要考虑 \(i\) 到达 \(u\) 节点之后的答案更新。所以此时我们只需要关注第一个到达这个节点的人就行。

那么跑一个多源最短路就可以求了,复杂度 \(\mathrm O((n + m) \log n)\)

posted @ 2025-12-07 15:52  sqrtqwq  阅读(27)  评论(0)    收藏  举报