模拟赛
2026.9.22
自胡蹿
考虑最优策略是什么。
一定是选择一个区间 \([l,r]\),不断操作让 \([l,r]\) 变成一个长度不小于 \(k\) 的回文串。
那么直接对这个 DP。维护状态函数 \(f_{l,r} = c\) 表示将 \([l,r]\) 变成回文串需要的最小操作次数。
那么对于 \([l,r]\),有:
- \(s_{l}\ne s_r\)。显然不可能形成回文串。
- \(s_{l}=s_r\)。可以同时拓展或单独拓展一边并给另一边操作一次。\(f_{l,r}=\min(f_{l+1,r-1},f_{l+1,r}+1,f_{l,r-1}+1)\)。
最后枚举选择的区间 \([l,r]\),代价就是 \(f_{l,r}+\max(0,k-(f_{l,r}+r-l+1))\)。
时间复杂度 \(O(n^2)\)。
跳跃
CF704B。
先考虑 \(O(n^2)\) 怎么做。
将代价拆开,变成 \((x_i+c_i),(-x_i+b_i),(x_i+a_i),(-x_i+d_i)\)。
连续段 DP。定义状态函数 \(f_{i,j}\) 为插入值 \([1,i]\) 后形成 \(j\) 个连续段时,代价最小值。分情况讨论:
- \(i\ne s,i\ne e\)。可以合并两个连续段(插在中间),插在一个连续段末尾或开头,单独形成一个连续段。
- \(i=s\)。可以单独形成一个连续段,插在一个连续段开头(且此时这个连续段不能再在开头插数)。
- \(i=e\)。可以单独形成一个连续段,插在一个连续段末尾(且此时这个连续段不能再在末尾插数)。
最后答案就是 \(f_{n,1}\)。时间复杂度 \(O(n^2)\)。
记 \(C_i = (x_i+c_i),B_i=(-x_i+b_i),A_i=(x_i+a_i),D_i = (-x_i+d_i)\)。
合并两个连续段代价是 \(A_i+ C_i\),插在末尾或开头是 \(A_i+D_i\) 或 \(B_i+C_i\),单独形成一个段是 \(C_i+D_i\)。
记 \(\alpha_i = B_i-A_i,\beta_i = D_i-C_i\)。那么就相当于先选 \((A_i+C_i)\),然后可以通过 \(\alpha_i,\beta_i\) 来变成其它情况。
这样每次加入一个 \(i\) 就可以考虑改变之前某个点的状态来插入。用小根堆维护最小值,复杂度 \(O(n\log n)\)。
当然连续段 DP 的第二维开小一点也可以过。
套娃
QOJ9865。
首先可以发现如果区间 \([l,r]\) 能全部合并在一起,那么任意一个 \([L,R]\subseteq [l,r]\) 也能全部合并在一起;同理如果 \([l,r]\) 不能合并在一起,那么任意一个 \([l,r]\subseteq [L,R]\) 也不能全部合并在一起。
想到维护极长可以合并在一起的区间。记 \(f_{l}\) 为最大的 \(r\),使得 \([l,r]\) 能够合并在一起。最后答案就等于从 \(x=1\) 开始,每次将 \(ans\) 加上 \(f_{x}-x\) 并将 \(x\) 跳到 \(f_x+1\)。
这个过程显然可以和 \(f_{l}\) 一起维护。
现在加入 \(a_r\),将 \([l, r-1]\) 划分成若干个极小的可能与之后某些数合并的区间。不妨设这些区间的值域分别是 \([L_1,R_1],[L_2,R_2],\dots,[L_k,R_k]\)。满足对于所有 \(1 \le i < k\),均有 \(R_i < L_{i+1}\) 或 \(L_i > R_{i+1}\)。
可以将它们的大小关系看成折线,\(R_i < L_{i+1}\) 看作向右上折;\(L_i > R_{i+1}\) 看作向右下。现在相当于加入一个点 \(a_r\),要求将这个折线从右往左合并的过程中不能出现值域区间相交的情况。
不妨设加入 \(a_r\) 后这个折线是向右下折的。找到前面第一个向右上折的点(\(R_{p}<L_{p+1}\)),当 \([p+1,k]\) 合并起来再和 \(a_r\) 合并后的值域区间与 \([L_p,R_p]\) 有交时,我们就不能直接把 \(a_r\) 加在后面。而是应该把 \([p,k]\) 合并起来,然后再尝试加入 \(a_r\)(因为 \([p+1,k]\) 永远都不可能独立得和后面某些数合并了)。
那么只需要维护每个点前面第一个折线方向不同的点编号。这个是简单的。
合并两个段段数会减少 \(1\),最多合并 \(n\) 次。所以复杂度 \(O(n)\)。
导览图
QOJ9805。
记第一棵树点集为 \(T_1\),第二棵为 \(T_2\)。
先考虑对一棵树计数。
注意到对于一条非树边 \((u,v)\),当其满足以下条件时是合法的:
- \((u,v)\) 不是横插边。
- 设 \(u\) 是 \(v\) 的祖先(不是则交换 \(u,v\))。记 \(w\) 为同时是 \(u\) 的儿子和 \(v\) 的祖先的那个点,则 \(w < v\)。因为当 \(w > v\) 时 \(u\) 会先走 \(v\),那么 \((u,w)\) 这条树边就不可能走到了。
那么对于一个树 \(T\),它的方案数就是 \(2^{\sum\limits_{u\ne root}^{}\sum\limits_{v\in subtree(u)}^{}[u < v]}\)。
再考虑求解原问题。先随便给 \(T_1\) 定一个根 \(root_1\),给 \(T_2\) 定一个根 \(root_2\)。
枚举连的这条边 \((u,v)\)(\(u\in T_1,v\in T_2\))。分情况讨论:
- \(x\in T_1\) 且 \(x\) 不在 \(u\) 到 \(root_1\) 路径上。此时 \(\sum\limits_{y\in subtree(x)}^{}[y>x]\) 不变。
- \(x\in T_1\) 且 \(x\) 在 \(u\) 到 \(root_1\) 路径上。当 \(x\ne root_1\) 时新的值等于原来的值加上 \(\sum\limits_{y\in T_2}^{}[y>x]\)。
- \(x\in T_2\)。此时 \(\sum\limits_{y\in subtree(x)}^{}[y>x]\) 就相当于以 \(v\) 为根时的值。
发现所有点实际上都只和自己所在的树有关。记 \(f(x)\) 为 \(u=x\) 时 \(T_1\) 中所有点贡献和,\(g(x)\) 为 \(v=x\) 时 \(T_2\) 中所有点贡献和。那么答案等于 \((\sum\limits_{u\in T_1}^{}f(u))\times (\sum\limits_{v\in T_2}^{}g(v))\)。
对于 \(f(u)\)。记 \(val = 2^{\sum\limits_{u\ne root}^{}\sum\limits_{v\in subtree(u)}^{}[u < v]}\),则 \(f(u) = val \times 2^{\sum\limits_{x\in P(u,root)\land x\ne root}^{}\sum\limits_{y\in T_2}^{}[y>x]}\)。对每个点 \(x\) 维护 \(c_x = 2^{\sum\limits_{y\in T_2}^{}[y>x]}\) 后就是点到根的 \(c\) 乘积。而 \(val\) 相当于是 \(O(n)\) 次查询子树在某个值域中点的数量。主席树维护即可。复杂度 \(O(n\log n)\)。
对于 \(g(u)\)。是一个换根的问题。假设现在已知 \(g(u)\),枚举一个 \(u\) 的儿子 \(v\),要求 \(g(v)\)。发现子树变化的点只有 \(u,v\) 两个点。变化前后的值也都形如查询子树在某个值域中点的数量,主席树维护。复杂度 \(O(n\log n)\)。
\(|T_1|\) 或 \(|T_2|\) 等于 \(1\) 时也可以不连边,这个方案数是简单的。
那么整体时间复杂度就是 \(O(n\log n)\) 的。
2026.9.23
游戏
把边转到点上,再做从下往上的差分。
那么将一条到根的链异或上 \(1\) 等价于单点修改。
每次操作只能把一个 \(1\) 变成 \(0\),终止局面为全 \(0\)。那么就只需要看有多少个 \(1\) 了。
不难发现,这个差分值实际上就是一个点所有边边权的异或和。那么一次修改只会影响 \(2\) 个点。
时间复杂度 \(O(n)\)。
小伙伴
把圆上 \(A\) 相同的点连边。得到 \(n\) 条弦。
对于任意两条弦,分情况讨论:
- 相交。由于最后弦是不交的,所以一定有某次交换被多算了一次。
- 不相交。显然可以保证任意时刻它们的关系都是不交的。
记 \(f(i)\) 为第 \(i\) 条弦的最小代价,那么答案就是 \(\sum f(i)\) 减去有交的弦对数。
记 \(L_i\) 为 \(A_x = i\) 中 \(x\) 较小值,\(R_i\) 为较大值。则答案等于 \(\sum\limits_{i=1}^{n}\min(R_i-L_i-1,L_i+2n-R_i-1)-\sum\limits_{i=1}^{n}\sum\limits_{j=i+1}^{n}[[L_i,R_i] 与 [L_j,R_j] 有交且不是包含关系]\)。
时间复杂度 \(O(n\log n)\)。
奇怪的树
考虑线段树分治。
那么 \(1\) 操作会变成 \(O(q)\) 个时间点,\(2\) 操作会变成 \(O((n+q)\log n)\) 个时间段。
因为信息不好合并,所以尝试把每个 \(1\) 操作都往这个时间点在线段树上的所有祖先中放一个。这样 \(1\) 操作是 \(O(q\log n)\) 个的。
问题变成,给定 \(k_i\) 个 \(1\) 操作的 \(u\) 和 \(s_i\) 个奇怪的点 \(v\),需要快速求出对每个点的贡献。其中 \(\sum k_i+s_i=O((n+q)\log n)\)。
建虚树直接跑一遍 DFS 即可。单次复杂度 \(O((k_i+s_i)\log(k_i+s_i))\)。整体复杂度就是 \(O((n+q)\log^2 n)\)。
但注意到复杂度瓶颈只在于给这 \(k_i+s_i\) 按照 dfn 序排序(排好后用单调栈和 \(O(1)\) 的 \(\text{lca}\) 建树),直接提前排序,然后按照 dfn 序插入那些操作即可。时间复杂度 \(O((n+q)\log n)\)。
三元组计数
对于一个边双,任意选择 \(3\) 个点当作 \(u,v,w\) 都是合法的。记点双大小为 \(s\),则方案数为 \(s^{\underline{3}}\)。
对于 \(u,v,w\) 不在一个边双的情况,将树上的边双缩一起之后等价于给定一棵树,每个点有个 \(cnt_{x}\),对所有合法的 \(u,v,w\) 求 \(cnt_u \times cnt_v \times cnt_w\) 之和。
这个容斥做。对于一个 \(w\),它合法的方案数就是 \((n-1)^2 -\sum\limits_{v\in son_w}^{}(siz_v)^2 - (n - siz_w)^2\)。对于这个缩完的数也可以这么维护。
用旅行的方式维护并查集来缩边双就行了。时间复杂度 \(O(n\alpha(n))\)。
2026.9.29
腐蚀
直接模拟。
每次取出耐久度最小的那个删掉,然后如果能合并左右就合并。
用 set 维护做到 \(O(Tn\log n)\)。
等差段
记 \(d_i = a_i - a_{i-1}\)。
那么一段区间是可修复的,当且仅当满足以下条件之一:
- \(d_{l+1}=d_{l+2}=\dots =d_r\)。
- \(d_{l+2}=d_{l+3}=\dots d_r\)。删去 \(a_l\)。
- \(d_{l+1}=d_{l+2}=\dots =d_{r-1}\)。删去 \(a_r\)。
- \(d_{l+1}=d_{l+2}=\dots = d_{k-1}=a_{k+1}-a_{k-1}=d_{k+2}=\dots =d_r\)。删去 \(a_k\)。
枚举删去的数就可以知道范围。
那么容易维护出 \(R_l\) 为最大的 \(r\),使得 \([l,r]\) 可修复。
然后倍增跳即可。时间复杂度 \(O(Tn\log n)\)。
极大积
不妨设排序后为 \(a<b<c<d\)。则在确定 \(a,b,c\) 时 \(d = \lfloor\frac{X}{abc}\rfloor\)。
枚举 \(a\),那么 \(a^4 \le X\)。再枚举 \(b\),那么 \(b^3 \le \frac{X}{a}\)。此时就是求 \(c\) 的取值范围,使得这个范围中的 \(c\) 满足 \(d >c\)。这个可以直接解方程。
再根据 \(a,b,c,d\) 实际上对应 \(p,q,r,s\) 哪一个再确定一个范围。
两个范围交就是实际贡献。复杂度 \(O(\sum\limits_{a\le X^{\frac{1}{4}}}^{}(\frac{X}{a})^{\frac{1}{3}}) = O(\sqrt{X})\)。
双游径
P13949。
能调出来也是神人了。
先缩点,得到一张 DAG。DAG 上每个点对应原图的一个简单环或一个点。
DAG 的生成是添加 \(0\) 度点的过程,题目的两条路径也是删除 \(0\) 度点的过程。不难想到按照一层一层剥 \(0\) 度点的方式来定义 DP 顺序。
具体地,维护集合 \(S_i\) 表示在第 \(i\) 轮被剥下的 \(0\) 度点集合。即 \(S_i\) 中的点 \(v\) 满足:
- 不存在 \(j > i,u\in S_j\),使得 \((u,v)\in E\)。
- 存在至少一个 \(u\in S_{i-1}\),使得 \((u,v)\in E\) 或 \(i=1\)。
显然,当某个 \(|S_i|\ge 3\) 时无解。因为这样分了之后只会存在上面层中的点向下面层中的点连边,所以无论如何都不可能让这几个点出现在两条路径中。
那么现在 \(|S_i|\in \{1,2\}\)。
一条路径显然是从上往下的。
对于 \(|S_i|=1\), 只要求至少一条路径经过它。
对于 \(|S_i|=2\),要求两条路径分别经过其中一个点。
定义状态函数 \(f_{x,y}\) 为当前路径停留在原图中点 \(x\) 和 \(y\) 的方案数。
一层一层枚举,再枚举这一层中缩之前的环上点或那个单独的点,然后枚举转移边。这样转移相当于是从 \((x,y)\) 走到 \((x',y')\),其中 \(x,x'\) 在一个环上或是同一个点,\(y,y'\) 一样。设这样合法的方案数为 \(w(x,x',y,y')\)。那么转移方程为 \(f_{u,v}\gets f_{x,y}\times w(x,x',y,y')\)。
显然 \(f_{x,y}\times w(x,x',y,y')\) 可以在转移完 \(f_{x,y}\) 的那一层时预处理得到,记为 \(g_{x',y'}\)。
那么 \(f_{u,v}\gets g_{x',y'}\)。这部分复杂度 \(O((n+m)^2)\)。
现在问题只在维护 \(g_{x',y'}\) 了。
如果 \(x,y\) 不在一个环上是简单的,比如当 \(x'\) 在环上下一个点是 \(x\) 时系数贡献 \(k\),否则贡献 \(k-1\)。
如果 \(x,y\) 在一个环上,要求是:
- 经过次数最多的点次数不超过 \(k\)。
- 每个点都要经过至少 \(1\) 次。
记 \(a,b\) 分别为 \(x,y\) 开始走时在环上套圈的次数。
破环成链之后 \(x,x'\) 和 \(y,y'\) 可以看作两个区间。根据这两个区间的相对关系可以知道被覆盖点的次数最大值为 \(x+y+\delta\)。分若干种情况讨论即可,此时 \(w(x,x',y,y')\) 就是可以根据 \(x+y+\delta \le k\) 求出来的(还有一些边界情况,类似于 \(x,y\) 不在一个简单环的那种)。然后就是一个二维前缀和。
整体时间复杂度 \(O((n+m)^2)\)。
2026.10.10
春
\(k=1\) 是简单的。
\(k=2\) 时不妨设有解情况下第一条直线覆盖的集合为 \(S\),第二条为 \(T\)(被同时覆盖的话随便放一个)。这样随便取两个点不属于同一个集合的概率为 \(\frac{2|S||T|}{n(n-1)}<\frac{1}{2}\)。那么随机取 \(30\) 对点就可以了。
时间复杂度 \(O(T\lambda n)\),其中 \(\lambda\) 为随机次数。
南见山
P15622。
枚举众数为 \(c\)。记 \(cnt_c(i)\) 为 \([1,i]\) 中 \(c\) 的数量。那么区间 \([l,r]\) 合法,当且仅当对所有 \(x\ne c\),\(cnt_c(r)-cnt_c(l-1)>cnt_x(r)-cnt_x(l-1)\)。
由此得到 \(3\) 个数组 \(a,b,c\)。条件为 \(r\) 完全偏序 \(l-1\)。
对每个 \(r\) 找到最小的 \(l\) 即可,用树套树。时间复杂度 \(O(n\log^2 n)\)。
可以做到单 log,因为有两维相差不超过 \(1\)(或者答案等于 \(n\))。
西廉贞
一个简单的想法是一棵树上面拼一条链。这样同构数量就等于这棵树子树同构的数量了。
因为大小为 \(n\) 的子树有 \(\frac{n^{n-2}}{n!}\) 棵不同构的树,所以给定的树在 \(n > 15\) 时就一定存在一个不同构子树。这个时候找到它再把剩下的点拼到根上面形成链即可。
\(n \le 15\) 时暴力枚举这个树,求代价最小的那个即可。
比赛
二分答案,问题变成判定。
一个比较简单的贪心是尽可能地让所有人都赢,实在没办法了再平局。
细节不用在意,反正怎么写都能过。
写完就会发现这个贪心也没用。
复杂度 \(O(n)\)。
2026.10.13
区间平移
可以对每对 \((l,r,L,R)\) 找到一些区间 \([a,b]\),使得 \(d\in [a,b]\) 时 \([l+d,r+d]\cap [L,R]\) 的变化是一定的。这样的区间只有 \(O(1)\) 个。
那么等价于有 \(O(n)\) 个区间加,查询前缀和的最大值。离散化之后模拟即可。
时间复杂度 \(O(n\log n)\)。
连号标记
容斥。定义 \(F(x)\) 为钦定 \(x\) 条边是连号边的方案数。那么 \(\text{ANS}=\sum\limits_{x\ge K}^{}(-1)^{x-K}\binom{x}{K}F(x)\)。
注意到在钦定连号边后,一条连号边构成的链是可以缩成一个点的。缩完之后得到树,其方案数显然就是 \(\frac{n'!}{\prod siz_u}\)。
问题变成对这个式子计数。直接背包即可,维护 \(siz\) 只需要在每条连号链的链顶算就行了。
时间复杂度 \(O(n^2)\)。
信号汇聚
P12585。
最短路可以用一棵最短路树表示。
简单分析可知一定存在最优解,使得这棵树任意子树都是一个区间。
定义状态函数 \(f_{h}(l,r,0/1)\) 为区间 \([l,r]\) 形成一棵最大深度不超过 \(h\) 的树,且树根为 \(l\) 或 \(r\) 时的最小代价。
用 \(f_{h-1}\) 转移 \(f_h\)。首先 \(f_h(l,r,k) \gets f_{h-1}(l,r,k)\)。
对于 \(f_{h}(l,r,1)\)。不妨设 \(r\) 的儿子有 \(p_1,p_2,\dots,p_k\),且 \(p_1<p_2<\dots<p_k\)。那么对 \(p_{2\sim k}\) 的情况,可以直接通过 \(f_{h}(L_{p_2},r,1)\) 得到。
枚举 \(p_1\) 和 \(L_{p_2} = x\)。转移为:\(f_h(l,r,1)\gets f_h(x,r,1)+f_{h-1}(l,p_1,1)+f_{h-1}(p_1,x-1,0)+(x_r-x_{p_1})^2\)。
维护辅助数组 \(g_h(l,r,1) = \min\limits_{x=l+1}^{r}(f_h(x,r,1)+f_{h-1}(l,x-1,0))\)。
那么转移变成 \(f_{h}(l,r,1)\gets f_{h-1}(l,p_1,1)+g_h(p_1,r,1)+(x_r-x_{p_1})^2\)。
那么整体时间复杂度就是 \(O(n^4)\) 的。
货运通道
QOJ18293。
记 \(r_i\) 为如果从 \(i\) 出发合法,至少要多少货物。
那么 \(r_n = 0,r_{i-1}=\max(0,r_i-A_i)\)。
对于一个询问 \(k\) 有解当且仅当 \(k\ge r_0\)。
最小代价显然就是满足 \(B_i\ge r_i\) 的最小代价,即 \(\sum\limits_{i=1}^{n-1}\max(0,r_i-B_i)\)。
记 \(c_i = \max(0,r_i-B_i)\)。
对 \(A_x\) 增加 \(y\)。首先只会对 \([0,x-1]\) 中的数产生影响。
维护 \(d_i\) 表示 \(r_i\) 的减少量,那么 \(d_{x-1} = \min(y,r_{x-1}),d_i = \min(r_i,d_{i+1})\)。
新的 \(r',c'\) 满足 \(r'_i = r_i-d_i,c'_i =\max(0,c_i-d_i)\)。
先考虑 \(r'\) 怎么维护。上线段树,记 \(R_i\) 为当前节点对应区间 \(r\) 的最小值,分情况讨论:
- \(R_i \le d_{lst}\)。此时一定会存在 \(r'_i = 0\) 的情况。递归下去处理。
- \(R_i > d_{lst}\)。此时一定不会存在 \(r’_i=0\) 的情况。整体减去 \(d_{lst}\) 即可。
同时如果某个时刻 \(d_{lst} = 0\),停止之后所有更新,因为后面都是无效更新。
这样一次递归要么遇到区间中有 \(0\),要么会将区间中某个点变成 \(0\)。前者只会是 \(x\) 前面第一个 \(0\)。而 \(y\ge 1\) 导致 \(r_i\) 单调不增,所以每个数只会变成 \(0\) 最多一次。均摊时间复杂度 \(O(n\log n)\)。
再考虑 \(c’\) 怎么维护。发现在维护 \(r'\) 的时候所有有效的 \(d\) 都是已知的了,对于一个 \(d\) 相同的区间,维护 \(C\) 表示最小正数值,分情况讨论:
- \(C \le d\)。递归下去处理。
- \(C>d\)。将所有正数整体减去 \(d\)。
显然,这个的复杂度也是 \(O(n\log n)\) 的。
2026.10.14
梦境
啥鸟人搬的题。
查询是简单的,只需要维护出连续 \(1\) 的段就行了。
对于操作 \(1\),考虑将序列重排为 \(p_{1\sim n}\)。这样每次 \(O(\log n)\) 找到后面第一个 \(1\) 的位置,记相邻两个 \(1\) 的位置为 \(l,r\)。若 \(r-1-k+1>l\),说明 \(p_{r-1}\) 之前就应该停止。此时 \(p_{r-1}\) 前面的 \(1\) 都会变成 \(0\),暴力修改即可。
这样将一个 \(0\) 变成 \(1\) 需要花费一次操作 \(2\),将 \(1\) 变成 \(0\) 需要 \(O(\log n)\) 的代价。那么最后就是 \(O(n\log n)\) 的。
黄金矿工
P11218 【MX-S4-T2】「yyOI R2」youyou 不喜欢夏天
考虑后手能改变什么。
不难发现后手可能产生影响,当且仅当这一列先手只选了一行,且选的这一行是 \(1\),另一行是 \(0\)。此时后手可以花费 \(1\) 的代价将 \(V\) 减少 \(2\)。
记这样的列数量为 \(k\)。则有 \(V = V_0 -2\min(k,m)\),其中 \(V_0\) 时最初先手选择连通块的贡献。
先手需要最大化 \(V\),也就是最大化 \(V_0 -2\min(k,m)\)。而 \(V_0 - 2\min(k,m) = \max(V_0-2k,V_0-2m)\)。所以两部分就是独立的了,分开 DP 即可。定义状态 \(f_{i,0/1/2}\) 表示考虑完前 \(i\) 列,且第 \(i\) 列的选择状态为 \(0/1/2\) 的最大贡献。
时间复杂度 \(O(n)\)。
惊喜
CF809E
记 \(S(x)\) 为 \(x\) 所有质因子构成的不可重集合。
对于欧拉函数,有:\(\phi(x) = x\times \prod\limits_{y\in S(x)}^{}\frac{y-1}{y}\)。
那么 \(\phi(a\times b)\) 就可以写成:
特别的,当 \(T = \emptyset\) 时令 \(\prod\limits_{y\in T}^{}\frac{1}{y-1} = 1\)。
根据常识,可知 \(\sum\limits_{i=1}^{n}2^{|\omega(i)|} = \frac{6}{\pi^2}n\log n + O(n)\)。那么对每个 \(i\) 暴力枚举 \(\omega(a_i)\) 的子集复杂度就是正确的。
这样问题变成给定下标集合 \(S\),求 \(\sum\limits_{x,y\in S \land x\ne y}^{}\phi(a_x)\times \phi(a_y)\times d(x,y)\)。上虚树即可,在插入时可以按照 dfn 序插入。这样复杂度为 \(O(n\log n)\)。
行走于真实之道
CF1895G
定义状态函数 \(f_{i,j}\) 为前 \(i\) 个字符,保留 \(j\) 个 \(1\) 的最大贡献。
维护 \(f_i\) 的差分数组 \(d_i\),观察 \(d_i\) 和 \(d_{i-1}\) 的关系。
对于 \(s_i = 0\),相当于是一个前缀 \(-1\)。
对于 \(s_i = 1\),相当于是先 \(d_i =d_{i-1}+(b_i-r_i)\),然后若 \(d_i < (b_i-r_i)\) 则让 \(d_i = (b_i-r_i)\),然后更新 \(d_{i+1}\)(这里 \(i\) 从大到小枚举)。
发现将差分数组排序不影响最终答案。
这样操作就变成了两个区间减法,一个插入。用平衡树维护即可。
时间复杂度 \(O(n\log n)\)。
2026.10.21
传递能量
CF2038B
二分答案为 \(k\)。
记 \(x_i\) 为点 \(i\) 的操作次数,那么对于每个 \(i\) 应该满足 \(a_i - 2x_i + x_{i-1}=k\)。
记 \(b_i = a_i - k\),那么 \(x_i = \frac{x_{i-1}+b_i}{2}\)。
解得 \(x_1 = \frac{\sum\limits_{i=2}^{n}2^{i-2}b_i + 2^{n-1}b_1}{2^n-1}\)。
那个大质数将这个式子写成 \(x_1 \equiv \frac{\sum\limits_{i=2}^{n}2^{i-2}b_i + 2^{n-1}b_1}{2^n-1}\pmod p\)。取模之后带回去 check 一下是不是真的即可。
时间复杂度 \(O(n\log V)\)。
分数
直接折半,最值分治做到 \(O(n\sqrt{V}\log n)\)。
数组
CF1609G
一个显然的结论是将 \(a,b\) 数组按照差分值归并起来就是最优访问顺序。证明可以邻项交换。
然后直接上线段树就做完了,每次询问暴力枚举 \(a\) 数组的差分数组中每个值算贡献即可。
时间复杂度 \(O(nq\log m)\)。
篮子
AT_agc035_e
对于每个最后被擦除的点 \(x\),如果 \(x-2\) 也被擦除连一条 \(x\to x-2\) 的边;如果 \(x+k\) 也被擦除连一条 \(x\to x+k\) 的边。
边 \(u\to v\) 表示 \(u\) 的操作时间在 \(v\) 之前。那么只要得到的图是 DAG 就合法。
如果 \(k\) 是偶数,不难发现状态合法当且仅当不存在 \(u,u+2,u+4,\dots ,u+k\),使得它们均被删除。奇偶拆开 DP 即可。时间复杂度 \(O(nk)\)。
如果 \(k\) 是奇数。将点排成两列,左边从上到下是 \(1,3,5\dots\),右边从上到下是 \(2,4,6\dots\)。将右边列的点向上移动,使得对于同层两个点 \(u,v\),满足 \(u + k = v\)。
这么排之后,不难发现一个环只会是从左边某个点向上走 \(x\) 步,向右走到右边列,向上再走 \(k+1-x\) 步,最后直接跳回这个点。
从上往下一层一层 DP。定义状态函数 \(f_{i,j,s}\) 为考虑完前 \(i\) 层,第 \(i\) 层左边列的点走若干步,最多能走到右边列第 \(i-j+1\) 层这个点(第 \(i\) 层左边列不选和走不到右边都视为 \(j=0\)),第 \(i\) 层右边列的点向上连续 \(s\) 个点都被删除的方案数。
分情况简单讨论即可。第 \(i\) 层的合法状态为 \(j \le k+1\) 的状态,因为 \(j\ge k+2\) 时在第 \(k+2\) 个点一定可以回来。
时间复杂度 \(O(n^2k)\)。

浙公网安备 33010602011771号