2025.10

已经十月了,玉玉。

一道云斗 NOI 模拟赛题

给定一棵大小为 \(n\) 的树,定义 \(v\) 对于 \(u\) 是好的,当且仅当不存在 \(w\not= v\) 使得 \(dis(u,v)=dis(u,w)\)

\(q\) 次询问,每次询问给定 \([l_1,r_1],[l_2,r_2]\),求出有多少点对 \((u,v)\),满足 \(u\in[l_1,r_1],v\in[l_2,r_2]\),且 \(v\) 对于 \(u\) 是好的。

数据范围:\(1\le n,q\le 10^5\)

先考虑如何求出所有合法点对的数量。容易发现对于任何一个点 \(u\),可能的好点全都在从 \(u\) 出发的最长链上。根据经典结论,这条链的另一个端点一定是某个直径端点。任取树的一条直径,以某个端点为根,变成对每个点 \(u\) 求出祖先里好点的数量,分别以两个端点为根跑一遍就能得到正确答案。

对树做 DFS 的过程中维护一个栈,走到 \(u\) 时让栈内的点恰好是所有好的祖先。一个祖先 \(v\) 不好可能是由于 \(u\) 子树内或者子树外某个点导致的,如果是子树外则在 \(u\) 祖先处 \(v\) 就会被弹出了,所以只考虑子树内。考虑对每个点求出来自不同两棵子树的最长链和次长链,DFS 的时候先走最长链并弹出距离不超过次长链深度的点,然后再走次长链,这样可以保证所有被弹出的点不会重新扔进栈内。

对栈的弹入弹出过程建一棵新树,相当于对于每个点它对应点的祖先都是好的。对询问做差分,可以把问题转化成:给定一棵树,查询有多少个点对 \((u,v)\) 满足 \(u\in[1,r_1],v\in[1,r_2]\) 并且 \(u\)\(v\) 的祖先。使用二次离线莫队可以做到 \(O(n\sqrt n)\)

CF2147F

考虑把第二个排列跟着第一个排列排序,这样后面的数一定可以到达前面的数,只需要考虑前到后的情况。

把这个到达关系建出图来,可以发现序列会被划分成若干区间,每个区间对应了一个 SCC,一个位置是某两个 SCC 的分界线当且仅当前面的数都小于后面的数。

换句话说一个位置 \(i\) 是分界线当且仅当 \(i\) 前面 \(\le i\) 的数有 \(i\) 个,对每个位置维护 \(i\) 减去前面 \(\le i\) 的数个数的结果,则这个序列是非负的,且是分界线相当于值为 \(0\),于是容易线段树直接维护了,pushup 可能需要一些讨论,\(O(n\log n)\)

QOJ3557

二分答案 \(x\),则相当于 \(A_i\oplus A_j<x\)\(i,j\) 必须是不同的颜色,问能否 \(K\) 染色。设 \(k\) 满足 \(2^k\le x <2^{k+1}\),注意到 \([2^{k+1}t,2^{k+1}(t+1))\) 这些区间之间没有任何限制,因此只需每个这样的区间都能 \(K\) 染色。还注意到 \([0,2^k)\)\([2^k,2^{k+1})\) 内部的颜色是两两不同的,因此相当于需要在这两段之间共用尽量多的颜色,即把 \(A_i\oplus A_j\ge x\)\(i,j\) 连边,求二分图的最大匹配。

考虑递归求最大匹配,考虑所有数的从低到高第 \(k\) 位,\([0,2^k)\) 当中第 \(k\) 位是 \(0,1\) 的数分别记作 \(L_1,R_1\)\([2^k,2^{k+1})\) 中的分别记作 \(L_2,R_2\)

考虑 \(x\) 的第 \(k\) 位:

  • 如果是 \(1\),则 \((L_1,R_1),(L_2,R_2)\) 异或的第 \(k\) 位是 \(0\),不可能有边,因此答案是 \((L_1,R_2)\)\((L_2,R_1)\) 的最大匹配之和。
  • 如果是 \(0\),则 \((L_1,R_2),(L_2,R_1)\) 异或的第 \(k\) 位是 \(1\),两两之间都有边,因此答案需要考虑 \((L_1,R_1),(L_2,R_2)\) 的最大匹配。这个最大匹配实际上可以视作任意匹配,只是对匹配数量有限制,因为当确定匹配数量后,可以先选择 \((L_1,R_1),(L_2,R_2)\) 中对应数量的匹配(点集不相交),然后再在 \((L_1,R_2),(L_2,R_1)\) 之间任意匹配。这样的最大匹配可以贪心求解(枚举一条边的匹配数量,或者讨论情况 \(O(1)\) 求解),构造方案也同理。

每次二分后需要 \(O(N\log A)\) 时间 check,总时间复杂度 \(O(N\log^2A)\)

CF1783G

何何的意味。

注意到你给每个点下面挂两个叶子带上边权,这个路径就没有方向了,答案一定能取到直径长度的一半。

10.1 南外模拟赛 A

原题是 P13046。

考虑设 \(dp_{i,0/1}\) 表示考虑前 \(i\) 个数,最后一段划分是否被 \(D\) 整除的方案数。

\(pre_i\) 表示前 \(i\) 个数构成的十进制数 \(\bmod D\) 的结果,则一段划分 \((j,i]\) 能被整除相当于 \(pre_i\equiv 10^{i-j}pre_j\pmod D\)

这个式子相当于 \(\frac{pre_i}{10^i}\equiv\frac{pre_j}{10^j}\pmod D\),如果 \(\gcd(10,D)=1\) 直接开个桶就做完了。

考虑 \(10\) 没有逆元怎么办,设 \(d\)\(D\) 只保留 \(2,5\) 的因子的结果,\(D'\)\(D\) 去掉 \(2,5\) 的因子的结果。

相当于上面判断的式子要在模 \(d,D'\) 的意义下都成立,可以从 CRT 的角度理解。

你发现当 \(j\)\(i\) 比较远的时候,一定有 \(10^{i-j}\)\(d\) 的倍数,那此时只需要满足 \(pre_i\)\(d\) 的倍数,并且模 \(D'\) 意义下那个式子成立。而对于模 \(D'\) 的情况,因为去掉了因子 \(2,5\),所以可以直接求逆元了。

离得近的情况,直接暴力转移就好了嘛。

复杂度 \(O(n\log p)\)

10.1 南外模拟赛 B

感觉这个题好像比 T1 简单多了啊。

考虑固定一个关键点为根,求出剩下所有关键点的 LCA 记为 \(p\),那么 \(p\) 到根的路径上的点答案都会加 \(1\)

发现这个 LCA 是容易换根 DP 求出来了,最后做一遍树上差分就好了,\(O(n\log n)\)

10.1 南外模拟赛 C

考虑列个期望 DP,设 \(f(u)\) 表示从 \(u\) 开始出发的答案,则 \(f(\text{叶子})=f(1)\)\(f(k)=0\),对于其它的点有

\[f(u)=\sum_{v\in son(u)}\frac{w(u,v)+f(v)}{deg_u} \]

考虑树上高斯消元,把每个点表示成 \(f(u)=k(u)\times f(1)+b(u)\) 的形式,就能解出来答案,\(k\)\(b\) 的转移是显然的。

由于 \(k\)\(b\) 都是直接从儿子转移的,直接把转移拆开发现只需要求:

  1. 所有能到 \(1\) 的边的边权,乘上到 \(1\) 路径上点的出度倒数积,求和。
  2. 当前能到 \(1\) 的所有的叶子(不算终点子树内的)到 \(1\) 路径上点的出度倒数积,求和。

先提前扫一下所有询问把树完整建出来,则每次操作的影响都能用 dfs 序转化成区间修改。

后面都是些 dirty work,反正肯定是 \(O(n\log n)\) 的,太答辩了赛时没写完啊啊啊啊啊啊。

赛后发现我其实是唐氏症,考虑 \(ans=\frac{b(1)}{1-k(1)}\),注意到 \(1-k(1)\) 的组合意义就是终点到根的出度倒数积,于是不用再额外维护每个叶子,这样就好写得多了。

10.1 南外模拟赛 D

原题是 P12569。

首先第一步观察是答案一定不超过 \(3\)。直接给出 \(3\) 步的构造,先特判掉全相等的情况,设 \(pre\) 表示序列的前缀和数组,找到最靠前的最小值和最大值的位置 \(x,y\)(这里认为有 \(x<y\),否则做一遍取反操作),将 \([x+1,n]\) 变成前缀和,再把 \([1,y]\) 变成后缀和。

于是对着答案分类讨论一下,\(ans=0\) 直接检查原数组,\(ans=1\) 一定是一次全局取反或者全局变成前后缀和,都是好判的。

\(ans=3\) 的情况如果判掉 \(ans=2\) 可以直接按照上面构造,所以只需要考虑 \(ans=2\)

首先判掉做一遍全局取反变成了 \(ans=1\) 的情况。不妨假设第二次操作是全局变前缀和,变后缀和的情况可以翻转序列,那第一次操作相当于是选一个区间变成了前缀和或者后缀和后,整个前缀和数组都非负了。

如果第一次是区间变前缀和,那发现这个区间肯定还是直接选一个前缀。直接枚举这个前缀选了啥,线段树维护前缀和数组即可。

如果第一次是区间变后缀和,这时候分析不出来额外的结构。设 \(suf\) 表示 \(pre\) 的后缀和,\(pre'\) 表示操作了 \([l,r]\) 后新的后缀和,分类列出来 \(pre'\) 的值最后等于什么:

  • \(i\in[1,l)\) 时,\(pre'_i=pre_i\)
  • \(i\in[l,r]\) 时,\(pre'_i=(i-l+1)pre_r-suf_l+suf_i\)
  • \(i\in(r,n]\) 时,\(pre'_i=(r-l+1)pre_r-suf_l+suf_{r+1}+pre_i\)

考虑扫描 \(r\), 尝试去寻找合法的 \(l\)。设 \(f(l)=l\cdot pre_r+suf_l\),根据上面条件其实就是:

  • \(\min_{i<l}pre_i\ge 0\)
  • \(f(l)-pre_r\le\min_{i=l}^rf(i)\)
  • \(f(l)-pre_r\le r\cdot pre_r+suf_{r+1}+\min_{i=r+1}^n pre_i\)

对于第一个条件,找到最小的 \(pre_p<0\)\(p\),限制必须有 \(l<p\) 即可。

对于后面的两个条件,我们先求出 \(\min_{i=1}^{p-1}f(i)\),如果当前有 \(r\ge p\) 判断这个值是否不超过 \(\min_{i=p}^rf(i)\) 即可,可以使用李超树或者单调队列维护凸壳来实现,但是维护凸壳查询也要带二分,所以复杂度都是 \(O(n\log n)\)

10.3 模拟赛 D

原题是 P12559,其实省集的时候就做过了,回来再复习下这题。

考虑确定了最终的 \(x\) 后答案是啥,首先我们要求 \(x\) 二进制下必须有区间最大值的最高位,然后区间内 \(\le x\) 的数一定可以通过一次操作解决,\(>x\) 的数则需要两次解决,所以我们只需要最小化 \(\min(x+\sum[a_i>x])\) 即可。大概有一些莫队做法,但是正解无关。

反向使用 Hall 定理,变成最大化 \(\max(\sum[a_i\le x]-x)\)。构建一张左部点为序列右部点为值域的二分图,左边的 \(i\) 向右部的 \(j\) 连边当且仅当 \(j\le a_i\),则可以发现上面的式子就是 \(\max(|S|-|N(S)|)\),也就是左部点最小失配数。

考虑询问区间如果是确定的,因为这个二分图形态特殊,直接贪心地从右往左扫能匹配就匹配即可(其实从左往右也一样,但是要和下面的扫描顺序相反)。对于整个问题,从左往右扫描线扫 \(r\) 同时维护匹配,如果加入 \(r\) 后不影响之前的匹配那就直接加入,否则选最小的 \(l\) 满足删去它后 \(r\) 能匹配,令 \(l\) 失配再让 \(r\) 匹配。一个询问 \([ql,qr]\) 的答案就是扫到 \(qr\)\([ql,qr]\) 中的失配点个数。同样利用 Hall 定理来维护匹配,设 \(w_x=x-\sum[a_i\le x]\)(只考虑目前在匹配中的 \(a_i\)),如果加入 \(r\) 后有 \(\min w_x\ge 0\) 则说明 \(r\) 能直接加入,否则找到最小的 \(l\) 满足删去 \(l\)\(\min w_x\ge 0\) 把它删掉即可,这些都是能线段树简单维护的。

考虑强制在线,发现上面的策略下一个点失配后以后再也不会用它匹配,所以如果一个 \(l\) 在扫到 \(r\) 被删除影响就是所有 \(ql\le l\land r\le qr\) 的询问 \([ql,qr]\) 答案都会 \(+1\),主席树维护矩形加单点查即可,复杂度 \(O(n\log n)\)

当然上面的讨论都没有考虑最高位的限制,实现的时候对每一位分开做即可。

P7737

考虑一个暴力就是计算正图上起点能到的和反图上终点能到的点,取交就是答案。

对于一般的情况,可以直接给关键点建立虚树变成规模更小的上述问题,直接在虚树上暴力做即可,但是细节很多。

10.7 南外模拟赛 A

首先容易发现如果当前的串是 \(01\) 交替的,操作一次之后会直接递归到三个子问题去。

把这个过程看成一棵三叉树,每操作一次会多两个叶子出来,所以这部分的方案数是一个双阶乘。

确定了树的结构后,需要决定每个叶子 \(1\) 的数量,所以需要再乘一个插板的组合数。

10.7 南外模拟赛 C

如果只有邻域同色数的限制,直接构造 \(s_i=\text{popcount}(i)\bmod 2\) 即可。

注意到这个构造直接让相连的点颜色都不同了,而我们的限制其实可以放松到 \(\sqrt n\),所以考虑在此基础上扰动一下。对每个数的二进制表示做分块,如果一个数 \(i\) 存在一个块全都是 \(1\),那么将 \(s_i\) 取反,容易验证满足条件。

怎么是纯脑电波题,懒得喷。

10.7 南外模拟赛 D

考虑点下面挂树这种看上去很逆天的操作到底是何意味,场上真的被骗了。

考虑每次把新挂的模板树缩成一个点,并记录它对应的模板树版本。维护每个版本的模板树是容易的,只需要主席树+树剖即可 \(O(n\log^2 n)\) 解决掉。这样在路径查询的时候,发现一条路径的和可以拆为 \(O(1)\) 次指定版本的模板树路径和查询,以及一次缩点后的树上路径和查询。在新树上相当于动态加叶子查询路径和,直接倍增即可。

然后考虑子树边权和。拆一下贡献,首先询问点所在模板树会有一个子树有贡献,然后新树上这棵模板树对应点连出去的边,如果起点在模板树上位于查询点的子树内,新树上对应整棵子树也会有贡献。想要 polylog 维护之需要 LCT,这里考虑使用根号重构。每次对新树重构的时候,把儿子按照 DFS 序排序,这样一次查询(默认查询的点不是新加的点,否则可以直接暴力 DFS)相当于一个区间内的儿子有子树和的贡献。对于新加的若干个点,暴力遍历它们,相当于判断最深的不是新加点的祖先,是否在那个儿子区间的子树内,这也是容易判断的。

视时限的精细程度可以做到 \(O(n\sqrt{n}\log n)\)\(O(n\sqrt{n\log n})\)\(O(n\sqrt n)\) 不等的复杂度,使用 LCT 则可以做到 \(O(n\log^2 n)\)

CF2128F

考虑如果 \(1\)\(n\) 的所有路径都要经过 \(k\) 那就爆了,否则最后解的形态一定是形如,找到一条 \(1\to n\) 的不经过 \(k\) 的路径 \(P\),让 \(P\) 上的边权全都取到下界,让 \(P\) 以外的边权全都取到上界。

一条路径 \(P\) 合法的条件是,\(\forall u,v\in P\)\(dis(u,v)<dis_r(u,k)+dis_r(k,v)\),其中 \(dis(u,v)\)\(P\)\(u,v\) 的距离,\(dis_r(u,v)\) 是所有边权都变成 \(r\)\(u,v\) 的最短路。相当于对 \(P\) 上的每个点 \(v\),我们要最小化 \(f_v=\max_u\{dis(u,v)-dis_r(u,k)\}\),其中 \(u\)\(P\) 上之前的任意一点。把它写成 DP 的形式转移,相当于对边 \((u,v)\)\(f_v\gets\max(f_u+w(u,v),-dis_r(v,k))\),如果 \(f_u\ge dis_r(k,u)\) 则说明不能走到 \(u\)。使用 Dijkstra 实现这个转移即可,复杂度 \(O(m\log n)\)

CF1442E

太难了,真的想不到/ng。

首先极大的同色连通块一定可以一起操作,这样先把它们缩掉,可以保证相邻点颜色不同。

考虑链且没有灰色的情况,容易发现答案是 \(\lfloor\frac{len}{2}\rfloor+1\)。如果扩展到一般的情况,设直径的长度为 \(d\),则发现可以取到 \(\lfloor\frac{d}{2}\rfloor+1\),具体的构造就是每次把同色的叶子给剥掉,并且这显然是个下界。所以有灰色的情况相当于是,决定每个灰点是染成黑色还是白色,使得再次缩点后直径长度尽可能小。

发现删的过程一定是黑白交替的,所以枚举下第一次删的颜色是什么,每个灰点的颜色就容易直接贪心得到了,可以使用拓扑排序来实现,复杂度线性。

10.8 南外模拟赛 A

首先把两种区间都按照左端点排序,一定分别按照这个顺序加入。然后就可以设 \(dp_{i,j}\) 表示两种区间分别加入了 \([1,i]\)\([1,j]\) 的最小花费,第一种区间的转移是 \(O(1)\) 的,但是第二种区间一次要转移一段,所以复杂度是 \(O(nm^2)\)

继续观察,考虑一个支配关系,如果二类区间中存在一个左端点更小且长度更小的区间那它其实根本没用,删掉这种区间后长度单调递减,转移就可以优化到 \(O(1)\) 了,复杂度 \(O(nm)\)

10.8 南外模拟赛 C

可以注意到,两个区间的交也必须是一个连续段,且左右的连续段值域上分别向大小方向延申。

枚举中间连续段的右端点 \(r\),不妨认为右边的连续段是上升的,否则翻转序列再做一遍即可。

可以发现,右边 \(>a_r\) 的最小的数 \(x\) 一定要被选择,否则无法和中间的段接上。考虑左边的限制,相当于要求 \(x-1\) 必须要被选上,带上交不小于 \(k\) 的限制左边能选的连续段端点会被限制在一个区间内。左边的个数选二乘上右边的个数,就是当前 \(r\) 的贡献。

所有的操作都可以使用维护最小值和最小值个数的线段树时限,复杂度 \(O(n\log n)\)

10.8 南外模拟赛 D

核心的观察就是相当于计算循环节为 \(n\) 的串的个数,然后剩下的都是些简单数论工作。

AGC043C

首先这个代价的意思就是,对于 \(x+y+z\) 最大的点 \((x,y,z)\) 能选就选一定是不劣的。显然新图上不会有边连接两个和相同的点,所以有个暴力的贪心就是,从大到小枚举和,然后对于当前和为这个数的点,邻域如果没有点被选过就选即可。

考虑给新图的边定个向,从和小的点连向和大的点。再考虑这张 DAG 上贪心的过程长什么样,相当于一个点被选当且仅当后继都没有被选,也就是它相当于一张博弈图,答案就是选上所有必败点。注意到三维上的移动分别都是独立的,所以可以对三张原图先分别算出来每个点的 SG 函数,然后相当于分别选一个点使得异或和为 \(0\)。注意到一个点的 SG 函数是 \(O(\sqrt m)\) 级别的,直接暴力即可。

ARC155D

首先如果要求每次操作后 \(G\) 都要变小,可以直接设 \(f_i\) 表示当前 \(G=i\) 时是否先手必胜。转移只需要枚举 \(j<i\land j\mid i\),如果存在 \(k\) 使得 \(\gcd(i,a_k)=j\) 就根据 \(dp_j\) 来转移即可。至于如何判断存在,可以提前莫反预处理一下。

对于一般的情况,发现任意局面下之前操作过的数一定都是 \(G\) 的倍数。只需要给状态多记一个 \(0/1\) 表示之前操作次数的奇偶性,需要特殊处理的情况就是如果当前的 \(i\) 只能转移到必胜态,那么 \(f_{i,cnt_i\bmod 2}\) 要特殊地判为必胜态,相当于此时先手可以拖延时间。

复杂度 \(O(n\log^2 n)\)

P9839

很牛气冲天的题目。

考虑一个特殊的情况就是 \(x=y\),这个时候每个人都不会打出自己手里的牌,只需要找到第一张相等的牌判断会被谁取到就行。对于一般的情况,考虑一张牌 \(a_i\) 如果一直留在手里不打出的效果是什么,找到下一个 \(j\) 满足 \(a_j=a_i\),如果 \(j\)\(i\) 的奇偶性相同则保留 \(a_i\) 的效果相当于是在时刻 \(j\) 获胜,否则发现会转化成上面 \(x=y\) 的情况,再找到下一个 \(k\) 满足 \(a_k=a_j\)

  • 如果 \(k\) 的奇偶性和 \(i\) 相同,则同样可以认为保留 \(a_i\) 相当于在时刻 \(j\) 获胜。
  • 否则认为保留 \(a_i\) 相当于在时刻 \(j\) 失败。

当然不存在 \(k\) 时认为是平局。处理出来保留每张牌对应的效果是什么,然后扫一遍贪心模拟就可以做到平方了。

当然有个问题是平局如何处理,有个巧妙的解决方法是开始认为平局算先手胜利跑一遍,再认为平局是后手胜利跑一遍。

上面的做法不能直接数据结构维护的原因是,如果一个人当前手里是会输的牌,来了一个能输的更晚的牌会换牌。注意到一个性质是,游戏结束的原因肯定是到了某个赢牌的时间而不是到了某个输牌的时间,这是因为一个人如果马上因为某张牌输了且新的牌还是输牌,换上这张新的牌一定能延长输的时间。有了这一点,只需要关心最早的赢牌被谁取到就可以了。

离线扫描线扫 \(r\),线段树维护保留当前每张牌的效果,一张牌的效果只会在扫到下一个和下下个与它相同的牌时改变,所以复杂度是 \(O(n\log n)\) 的,非常厉害。

P2599

感觉也非常高妙,很不是人类。

大概就是设 \(L_{i,j}\) 表示给区间 \([i,j]\) 左边放上多少石子后先手必败,显然这个数是唯一的,同理定义 \(R_{i,j}\)

转移是比较高妙的分类讨论,思想就是尽可能转化成已知的简单 case。

10.11 南外模拟赛 B

\(11\) 的倍数的性质是,奇数位之和与偶数位之和模 \(11\) 是同余的。

把数分为有奇数位的和有偶数位的两部分,对它们分别 DP 一下决定贡献是正的还是负的,然后再把偶数位的数插进奇数位的数即可。

时间复杂度 \(O(11n^2)\)

10.11 南外模拟赛 C

首先预处理出剩下单个连通块时,每种颜色数对应的 SG 函数值。

然后一次询问需要支持求,去掉它后剩下子树对应的 SG 函数异或和,分为子树内和子树外两部分。

对于子树内,这是一个经典的领域查询的形式,使用树剖把轻重儿子分开维护,每个点维护所有轻儿子的答案,这样查询只需要单独处理重儿子,且更新只需要修改祖先上的 \(O(\log n)\) 个点。

对于子树外,可以考虑求只在子树内的颜色数。对于一种颜色求出所有点的 LCA,可以认为这种颜色是在 LCA 处出现的。对每个颜色开 set 按照 DFS 序维护当前的点,LCA 就是 DFS 序最小和最大的点的 LCA。

注意带修子树数颜色是链加单点查,不用转序列,复杂度 \(O(n\log^2 n)\)

10.11 南外模拟赛 D

称某个时刻点 \(u\) 是空的当且仅当无论起始点在哪目前都不可能在 \(u\)

对于 \(u-v-w\)\(u-w\) 间无连边,若 \(v\) 是空的,那么我们可以让这三个点颜色相同来让 \(u,w\) 都变成空的。

判掉完全图后,我们取一个原图的深度至少是 \(2\) 的 BFS 树,并希望除了根以外都是空的,这样所有点都一定相遇。我们假设此时第二层已经全是空的。BFS 树的性质为每个点和其祖父没有连边。

我们将树分层,首先我们从上往下让所有偶数层清空:对于层 \(2i\),我们首先让其父亲通过一次操作移动到祖父(注意祖父目前已经空了),然后再对 \(u-fa_u-fa_{fa_u}\) 做一次操作使得当前点和其祖父变成空的。然后我们再从下往上让所有奇数层(除了根)变空:对于层 \(2i+1\),我们首先操作 \(u-fa_u-fa_{fa_u}\) 让其和其祖父变空,然后再将其父亲通过一次操作移到其祖父,这样其和其父亲都空了。

考虑如何制造第二层全空的情况:首先任取 \(u-v-w\) 满足 \(u-w\) 无连边,并取 \(u\) 为根。先用 \(2n\) 次操作清空 \(v\),然后用一次操作清空 \(u\)\(w\)。对于所有第二层的边,我们每次先把 \(v\) 移到 \(w\),再把这个点移到 \(u\),此时 \(v\) 是空的,做一次 \(u-v-w\) 可以清空 \(u\)\(w\)

P7078

首先当前最强的蛇如果吃完最弱的蛇没有变成最弱的,则一定会选择吃。证明是容易的,首先如果吃完还是最强的肯定没问题,否则新的最强者吃完新的最弱者一定更弱,所以也没问题。所以这种情况先直接模拟掉。

现在假设最强的吃完会变成最弱的,如果吃了那下一轮可能会接着被吃,但是下一轮新的最强蛇吃完了可能又变成最弱的了,这个过程会递归下去。递归边界是什么呢?如果当前最强的吃完又不是最弱的了,或者没别的蛇了,结果就是确定的了。

用 set 维护是 \(O(n\log n)\) 的,使用队列维护可以 \(O(n)\)

ARC164E

考虑设不同的断点数量为 \(cnt\),那么第一问的答案就是最小的 \(d\) 满足 \(2^d+1\ge cnt\),因为前 \(d\) 层最多就这么多断点。

考虑前几层放尽量多的断点是最优的,所以第 \(d\) 层要放的断点数量是固定的。设 \(f_{i,j}\) 表示考虑了前 \(i\) 个断点,第 \(d-1\) 层已经有了 \(j\) 个断点的贡献,具体贡献是啥是容易计算的,总之直接转移就是 \(O(n^2)\) 的。

10.11 某模拟赛 T2

\(op=1\):首先会花费 \(c\) 的代价把值 \(x\) 改到前缀最大值,其中 \(c\)\(pos=p_{x}^{-1}\) 前面比 \(x\) 大的个数。如果 \(k\leq c\) 直接判掉。之后根据值转 \(01\),那么会向右移动的一定是把一些 \(0\) 换到了 \(x\) 左边。由于 \(1\) 之间具体怎么动是无关的,所以只关心相对位置变化。找到原始位置 \(pos\) 之后第 \(k-c\)\(1\) 的位置 \(pos'\),那么这些影响他的 \(0\) 就是 \([p,pos']\)\(0\) 的个数。对于 \(01\) 直接按照 \(x\) 进行扫描线,树状数组二分一下,时间复杂度 \(\mathcal O((n+q)\log n)\)

\(op=2\):有一个直接整体二分转 \(01\) 的做法,没有用什么性质。注意到冒泡排序 \(k\) 轮一定会把前 \(k\) 大提到最后,如果 \(x\ge r-k+1\) 就是查询区间第 \(r-x+1\) 大。否则最终 \([l,x]\) 只与 \([l,x+k]\) 中的数有关。改成查询 \([l,x]\) 的和减去 \([l,x-1]\) 的和;最终 \([l,x]\) 构成的数集我们猜测就是 \([l,x+k]\) 中去掉前 \(k\) 大的结果。使用主席树直接做,时间复杂度 \(O((n+q)\log n)\)

AT_awtf2025_b

首先确定子集的时候,有个简单的贪心是把区间按照右端点排序,然后尽可能往左扔。

考虑用 \(01\) 序列记录每一天是否看过电影,一个经典的想法是考虑把贡献拆到这个序列上,比如计算每个位置在多少个子集里是 \(1\)。发现这是困难的。一个比较牛的想法是,转而去拆到每个 \(1\) 的连续段上,也就是对每个 \([l,r]\) 去统计有多少子集里它作为一个极长的 \(1\) 的连续段出现。

这么做的道理是什么?考虑设 \(f_{l,r}\) 表示这个东西,目前可能还是觉得不对劲,这看上去根本不像一个能转移的子问题。冷静分析一下发现一件惊人的事情,\([l,r]\) 内的 \(1\) 一定都是 \(L\in[l,r]\) 的区间扔过来的,考虑如果 \(L<l\) 但是扔过来一个 \(1\),一定与极长的限制矛盾。

这样就合理多了,于是现在的状态就是记 \(f_{i,l,r}\) 表示当前考虑到区间 \(i\)(提前按照贪心的顺序排序),选择 \(L\in[l,r]\) 的区间把 \([l,r]\) 填满的方案数,转移简单讨论下即可,最后只需要再做一遍线性 DP 统计答案,复杂度 \(O(n^3m)\)

10.13 南外模拟赛 A

10.13 南外模拟赛 D

CF1801E

10.14 南外模拟赛 B

10.14 南外模拟赛 C

10.14 南外模拟赛 D

posted @ 2025-10-15 23:31  KingPowers  阅读(6)  评论(0)    收藏  举报