Logo KSCD_ 的博客

博客

标签
暂无

SSP Round 2 题解

T1 空泣

原题 P11663,是小 X 推荐的,使用了小 S 帮忙搞的官方数据。

比较容易,也没卡 $\mathcal O(n\log n)$ 做法,难度不超过绿。

另外子任务 $3,4$ 没想到简便做法,有的话欢迎分享。


Sol.1

枚举答案,再枚举起始位置,每次 $\mathcal O(n)$ 扫一遍判合法。复杂度 $\mathcal O(n^2r)$,其中 $r$ 为答案,期望得分 $10$。

Sol.2

$x$ 合法必有 $x+1$ 也合法,于是答案可二分,同样枚举起始位置判断即可。复杂度 $\mathcal O(n^2\log V)$,期望得分 $30$。

Sol.3

枚举起始位置后快速算答案,以从 $1$ 开始为例,答案为 $\max_{i=1}^n a_i-s_{i-1}$,其中 $s$ 为 $b$ 的前缀和。对所有起点的答案求最值即可,复杂度 $\mathcal O(n^2)$,期望得分 $30$。

Sol.4

将 $a,b$ 重复一遍实现断环为链,在长为 $2n$ 的数组上对 $b$ 做前缀和得到 $s$。之后对 $p\in[1,n]$ 分别求区间 $[p,p+n-1]$ 的答案,即 $\max_{i=p}^{p+n-1} a_i-(s_{i-1}-s_{p-1})$,求 $a_i-s_{i-1}$ 的区间最小值即可。区间左右端点均递增,可单调队列 $\mathcal O(n)$ 解决,期望得分 $100$,当然也可以前后缀分别求。另外 ST 表或线段树的 $\mathcal O(n\log n)$,以及二分的 $\mathcal O(n\log V)$ 都能过。

T2 诗空茫

小 X 供题的加强,他给的是 $n\le 5000,m=10^7+7$,也就是本题的 $80$。

$80$ 大概是绿题难度,后面 $20$ 非常难推,推导难度可能有紫到黑,个人只会已知结论倒过来证明,如果会打表 + 注意力够强应该也能做出来


不存在长为 $3$ 的上升子序列即最长上升子序列长度不超过 $2$,用 $n!$ 减去这样的排列数量即为答案。

Sol.1

暴力枚举全排列或状压 DP,复杂度 $\mathcal O(n!\text{poly}(n))$ 或 $\mathcal O(2^n\text{poly}(n))$,期望得分 $[5,15]$。

Sol.2

考虑最长上升子序列的求解过程,即从左往右扫,实时维护当前长为 $i$ 的上升子序列结尾最小值 $g_i$。由于长度不超过 $2$,且显然 $g_1=1$,状态为 $f_{i,x}$ 表示长为 $i$ 的排列中 $g_2=x$ 的数量,边界为 $f_{2,2}=1$。

状态中 $x$ 即前 $i$ 个数中当前 $g_2$ 的相对排名,于是枚举 $p_{i+1}$ 在前 $(i+1)$ 个数中的相对排名即可转移。注意还需考虑从降序排列转移来的情况,最后也要把降序排列减去。复杂度 $\mathcal O(n^3)$,期望得分 $40$。

Sol.3

另一种思路是从小往大填,此时新加的值最大,因此不能放在当前长为 $2$ 的上升子序列(顺序对)之后,于是状态内需记录最靠前的顺序对结尾。设 $f_{i,j}$ 表示填了前 $i$ 小值后最靠前的顺序对结尾为 $j$ 的排列数量,边界为 $f_{2,2}=1$,可枚举 $(i+1)$ 的相对位置转移,细节同上。复杂度 $\mathcal O(n^3)$,期望得分 $40$

感性理解可以发现上面两种做法基本相同,其实写出来一模一样,本质是在 $(i,p_i)$ 的二维平面内扫描一维,并记录另一维的信息以便转移。

$m=998244353$ 是给 $\mathcal O(n^3)$ 做法打表的,期望得分 $50$。这也是为什么只有 $n$ 的计数题要输入模数。

Sol.4

上面的 $\mathcal O(n^3)$ 做法非常容易后缀和优化,于是就 $\mathcal O(n^2)$ 了,期望得分 $80$

Sol.5

给出结论:长为 $n$ 且最长上升子序列长度不超过 $2$ 的排列数量为卡特兰数第 $n$ 项。

证明考虑构造双射,将 $n$ 个点 $(i,p_i)$ 画到平面上,找到 $p_i$ 后缀最大值位置集合。以这些位置为拐点,画出从 $(n,0)$ 到 $(0,n)$ 的折线。由于长为 $i$ 的后缀最大值不低于 $i$,折线除端点外均在直线 $x+y=n$ 上方。于是从后往前,每个前缀中向上次数不低于向左次数,作为两种括号即为合法括号序列,合法折线数量即卡特兰数。

显然任意排列可映射到唯一合法折线,下面证明任意合法折线可映射到唯一合法(最长上升子序列长度不超过 $2$ )排列。对于合法折线,可通过拐点还原出所有后缀最大值及位置。要构成合法排列,剩余值必须按降序依次填入空位,否则存在非后缀最大值位置 $i\lt j,p_i\lt p_j$,此时找到某个后缀最大值位置 $k\gt j$,长为 $3$ 的上升子序列 $i,j,k$ 会使排列非法。于是结论得证,合法排列与合法折线形成双射,两者数量相等,均为卡特兰数。

于是求卡特兰数第 $n$ 项 $\frac {2n\choose n}{n+1}$,在 $m$ 为质数时可通过阶乘及逆元求,复杂度 $\mathcal O(n)$。期望得分 $20$,拼上 Sol.4 期望得分 $90$。

Sol.6

$m$ 为合数时有的数不存在乘法逆元,无法实现除法。将式子拆组合数约分得到 $\frac{\prod_{i=n+2}^{2n}i}{\prod_{i=1}^ni}$,可求出该值中每个质因子的次数,最后快速幂求出答案。线性筛出 $2n$ 内所有质数及每个数的最小质因子,之后依次分解质因数加入,用桶维护当前次数即可。复杂度为分解质因数的 $\mathcal O(n\log n)$,期望得分 $100$。最后的快速幂其实是 $\mathcal O(n)$ 的,因为质数只有 $\mathcal O(\frac {n}{\log n})$ 个。

T3 血路

SDSC2025 D3T3 By do_while_true,原题

数据自造,强度未知,但已经对着小 S 的错解尽可能卡了。


最优解中所有区间必然首尾相接,否则可调整消掉中间的空位。

另外可先找到所有区间的交点 $x$,并通过整体平移将交点变为 $0$,方便之后讨论。这样就变成原题了。

Sol.1

根据上述结论可以写一些暴力,期望得分 $[5,30]$。

Sol.2

观察最优解结构,设完全在 $0$ 左侧的区间有 $x$ 个,完全在 $0$ 右侧的区间有 $y$ 个。只要 $x\ne y$,就能将解整体向 $x,y$ 中较小的一侧平移,这样这些区间贡献严格减少,包含 $0$ 的区间只可能贡献 $1,-1$,总体代价必然不增。

若 $n$ 为偶数,根据上述调整最优解必然存在一个区间端点为 $0$,且 $0$ 将所有区间分成数量相同的两部分,这可以 DP 解决。令左右两侧区间集合从远到近分别为 $p,q$,零下标下答案为 $\sum_{i=0}^{\left|p\right|-1} (r_{p_i}+\sum_{j=i+1}^{\left|p\right|-1} len_{p_j})+\sum_{i=0}^{\left|q\right|-1}(-l_{q_i}+\sum_{j=i+1}^{\left|q\right|-1}len_{q_j})$,其中 $len_i=r_i-l_i$,含义即所有区间需要移动的次数和。

将 $len$ 项拆贡献避免对 $j$ 的枚举,可得 $\sum_{i=0}^{\left|p\right|-1} (r_{p_i}+ilen_{p_i})+\sum_{i=0}^{\left|q\right|-1}(-l_{q_i}+ilen_{q_i})$,最小化时显然小的 $i$ 应对应大的 $len$,即 $p,q$ 分别按 $len$ 降序排序最优。于是初始对所有区间按 $len$ 排序,之后 DP 设 $f_{i,j}$ 表示前 $i$ 个区间中 $j$ 个在 $0$ 左侧的最小贡献和,即可 $\mathcal O(n^2)$ 解决偶数情况,期望得分 $50$

Sol.3

对于 $n$ 为奇数的情况,最终两侧区间数量必然相等。此时在中间区间包含 $0$ 的前提下左右平移时,两侧区间贡献不变,因此中间区间位于初始位置最优。令中间区间为 $t$,$p,q$ 含义同上,答案为$\sum_{i=0}^{\left|p\right|-1} (r_{p_i}+\sum_{j=i+1}^{\left|p\right|-1} len_{p_j})+\sum_{i=0}^{\left|q\right|-1}(-l_{q_i}+\sum_{j=i+1}^{\left|q\right|-1}len_{q_j})-\left|p\right|l_t+\left|q\right|r_t$,即两侧区间初始要移到 $t$ 两侧。枚举中间区间 $t$ 后可以同样 DP,总复杂度 $\mathcal O(n^3)$,期望得分 $35$,拼上 Sol.2 期望得分 $85$。

Sol.4

事实上由于 $\left|p\right|=\left|q\right|=\frac{n-1}2$,式子最后两项必为 $\frac{n-1}2len_t$。于是不需要枚举中间区间,直接设 $f_{i,j,0/1}$ 表示前 $i$ 个区间中 $j$ 个在 $0$ 左侧,是否已有中间区间的最小贡献和,过程中确定即可做到 $\mathcal O(n^2)$。另外部分转移与偶数情况相同,偶数时不选中间区间即可,可以写在一起。期望得分 $100$

T4 欲泪海

SDSC2025 D1T4 By yixiuge777,原题 CF1540D,其实也没有特别难。

另外特殊性质 B 没想到简便做法,有的话欢迎分享。


Sol.1

每次询问枚举全排列,复杂度 $\mathcal O(qn!\text{poly}(n))$,期望得分 $5$。

Sol.2

注意到 $b_i$ 确定了 $p_i$ 在前 $i$ 个数中的相对排名,于是从左往右扫,维护当前前缀内所有数的大小关系,每次将 $i$ 插入到第 $(b_i+1) $ 大的位置;也可以从右往左扫,每次将 $p_i$ 确定为当前未使用过的第 $(b_i+1)$ 大值。这样可以求出整个排列,暴力做总复杂度 $\mathcal O(qn^2)$,A 性质下 $\mathcal O(n^2+q)$,期望得分 $15$。

通过该做法可以证明 $b$ 数组对应唯一的合法排列 $p$,两者能形成双射,题面里的最小值是诈骗。

Sol.3

数据结构加速 Sol.2 的过程,比较容易的是倒着确定值,用权值线段树 / 树状数组上二分即可。总复杂度 $\mathcal O(qn\log n)$,A 性质下 $\mathcal O(n\log n)$,期望得分 $40$

Sol.4

注意到只询问单个位置,求出整个排列有点浪费。只关注 $p_i$ 的值,从前 $i$ 个数开始不断向后扩展,维护当前 $p_i$ 的相对排名 $x$,初始为 $b_i+1$。加入位置 $j$ 时,若 $b_j\ge x$ 则 $x$ 不变,否则 $x$ 加一,这样最终得到的 $x$ 即为答案。总复杂度 $\mathcal O(nq)$,期望得分 $45$,拼上 Sol.3 做 A 性质期望得分 $55$。

Sol.5

数据结构加速 Sol.4 的过程。注意到 $j$ 位置会将 $x\gt b_j$ 的 $x$ 加一,增加量是分段一次函数。线段树维护区间一次函数复合,则长为 $len$ 的区间一次函数至多有 $(len+1)$ 段,且必然单调不降。将信息压到段数级别,维护 $a_i$ 表示函数中加 $i$ 的最小 $x$ 值,$a$ 是长为 $\mathcal O(len)$ 的单调不降数组。查询时在 $a$ 上二分即可。

考虑将 $f,g$ 合并得到 $h$,根据定义有 $h_i=\min_{j=0}^{i}(\max(f_j,g_{i-j}-j))$。有结论:令 $h_i$ 取最小值的 $j$ 为 $t_i$,则 $t$ 是单调不降的,即 $t_i\le t_{i+1}$。证明考虑首先 $h_i$ 不降,因为 $f_j$ 不变且 $g_{i-j}$ 随 $i$ 增大而增大。之后求 $h_{i+1}$ 可从 $x=h_i$ 开始枚举 $x$ 并检查是否合法,方式为取 $f_j\le x$ 的最大 $j$,看 $\max(f_j,g_{i-j}-j)$ 是否不超过 $x$。在该过程中用于检查的 $j$ 不会低于 $t_i$,于是 $t_{i+1}\ge t_i$。

有了上述结论,用指针维护当前最优的 $j$,可 $\mathcal O(len)$ 合并出长为 $len$ 的数组 $h$。于是线段树维护区间信息,单点修改时从叶子修改到根,单次复杂度 $\mathcal O(n)$。查询时依次在对应的 $\mathcal O(\log n)$ 个节点上二分,单次复杂度 $\mathcal O(\log ^2n)$。总复杂度 $\mathcal O(qn)$,A 性质下 $\mathcal O(n\log n+q\log^2 n)$,期望得分 $55$。

另外其实有更强结论:$t_{i+1}\in\{t_i,t_i+1\}$,证明需观察 $h_i$ 的结构,由于最小值必取在单增的 $f_j$ 和单减的 $g_{i-j}-j$ 交点处,讨论交点两侧大小关系即可证明。用该结论会略微降低实现难度和常数,不太重要。

Sol.6

对于这种修改查询复杂度不平衡的情况,可以使用分块平衡。具体地,每 $B$ 个位置分一块,每块开线段树维护整块函数信息,单点修改复杂度降到 $\mathcal O(B)$;查询时暴力跳所在块内元素,再依次在后面块上线段树根节点二分,查询复杂度为 $\mathcal O(B+\frac{n}B\log B)$,平衡取 $B=\sqrt{n\log n}$ 即有复杂度 $\mathcal O(q\sqrt{n\log n})$,期望得分 $100$。实际上由于线段树的大常数和 upper_bound 的小常数,$B$ 取小一点会跑得更快。

另外使用双指针或分散层叠似乎可以做到单根号,不过常数应该不小,意义不大。

后记

感谢推荐 / 提供了前两题的小 X,进行了部分验题的小 S,以及一起讨论 T2 证明的小 W小 C小 D

MOCKER44. 好听。SSP 是其外号 烧诗P 的缩写,并非费用流算法。SSP Round 1 可在此处查看。

最后祝大家春节快乐!之后都能 rp++!


爆竹鸣响长夜未已

飞鸟衔新叶回巢

归乡自天涯海角

山间的小路它也此刻往来热闹

齐思量出游相邀

共祝来年节节高

结彩串巷共迎灯宵

——MOCKER44. / 洛天依《游春》

P9447 题解

本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2025-11-20 16:38:20

怎么题解区全是线段树,这个应该好写一些。

题意

$n$ 条射线绕中心形成一个环,有 $m$ 条连接相邻两射线的线段,两端点到中心距离相等。初始选择某射线向外走,遇到线段时强制走到另一端。可以任意加入满足同样限制的线段,对每个 $i$ 求初始在 $i$ 射线上走,最终走到 $s$ 射线无穷远处需要加入的最少线段数。$n\le 2\times 10^5,m\le 5\times 10^5$。

题解

由于是强制走过线段,若按到中心的距离从大到小考虑,则每条线段相当于交换相邻两条射线的终点编号,要求即最终 $i$ 射线终点为 $s$。考虑按该顺序 DP,设 $f_{i,j}$ 表示考虑了前 $i$ 条给定线段,当前 $j$ 射线终点为 $s$ 的最小加入数,有初始值 $f_{0,i}=\min(\left|s-i\right|,n-\left|s-i\right|)$。

至于转移,先交换 $f_{i-1,t_{i}},f_{i-1,t_{i}\bmod n+1}$。之后还要考虑线段的加入,有 $f'{i,j}=\min f{i-1,k}+\min(\left|j-k\right|,n-\left|j-k\right|)$。由于只有两个位置变化,只需要尝试用较小值向外更新,并尝试更新较大值,可以做到单次 $\mathcal O(n)$,总复杂度 $\mathcal O(nm)$,答案即 $f_{m,i}$。

观察这个 DP 的形式,注意到差分数组只有 $-1,0,1$,否则一定可以更新,于是考虑维护差分数组 $g_i=f_{i}-f_{(i+n-2)\bmod n+1}$。设 $x=t_i,y=t_i\bmod n+1$,$g_y=0$ 时交换没有影响,以下以 $g_y=1$ 为例,$g_y=-1$ 是类似的。

首先考虑 $x$ 位置的变化,$f_x$ 先由于交换增加 $1$。此时若 $g_x=1$,则 $f_x$ 还会被上个位置拉回来,于是 $g_x$ 仍为 $1$,$g_y$ 变成 $0$;否则就拉不回来了,$g_x$ 增加 $1$,$g_y$ 变成 $-1$。至于 $y$ 减小对其他位置的影响,显然无法更新前面元素,画图可得从 $y$ 向后找到首个非 $1$ 位置 $z$,此前的 $f$ 值均会减一,在 $g$ 上的影响即 $g_z$ 增加 $1$。

这需要查询 $y$ 后面首个非 $1$ 位置,在 $g_y=-1$ 时是前面首个非 $-1$ 位置,用 set 分别维护两种下标,单点改的时候也修改 set 即可。另外若只考虑给定操作会将 $s$ 交换到 $t$,则一定有 $f_{m,t}=0$,从该位置按 $g$ 数组推出 $f$ 即为答案,复杂度 $\mathcal O(m\log n)$。

代码

#include<bits\/stdc++.h>
using namespace std;
const int N=5e5+10;
int n,m,s,f[N],g[N]; pair<int,int> a[N];
set <int> sa,sb;
void cg(int p,int x)
{
	if(g[p]==1&&x!=1) sa.insert(p);
	if(g[p]!=1&&x==1) sa.erase(p);
	if(g[p]==-1&&x!=-1) sb.insert(p);
	if(g[p]!=-1&&x==-1) sb.erase(p);
	g[p]=x;
}
int main()
{
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	cin>>n>>m>>s;
	for(int i=1;i<=m;i++) cin>>a[i].first>>a[i].second;
	for(int i=1;i<=n;i++) f[i]=min(abs(i-s),n-abs(i-s));
	sort(a+1,a+1+m);
	for(int i=1;i<=n;i++)
	{
		g[i]=f[i]-f[(i+n-2)%n+1];
		if(g[i]!=1) sa.insert(i);
		if(g[i]!=-1) sb.insert(i);
	}
	for(int _=m;_;_--)
	{
		int x=a[_].second,y=x%n+1;
		if(s==x||s==y) s=(s^x^y);
		if(!g[y]) continue;
		if(g[y]==1)
		{
			int z=-1; auto it=sa.upper_bound(y);
			if(it!=sa.end()) z=*it;
			else z=*sa.begin();
			cg(z,g[z]==0);
			if(g[x]==1) cg(y,0);
			else cg(y,-1),cg(x,g[x]==0);
		}
		else
		{
			int z=-1; auto it=sb.lower_bound(y);
			if(it!=sb.begin()) z=*prev(it,1);
			else z=*prev(sb.end(),1);
			cg(z,g[z]?0:-1),z=y%n+1;
			if(g[z]==-1) cg(y,0);
			else cg(y,1),cg(z,g[z]?0:-1);
		}
	}
	f[s]=0;
	for(int i=s;i>1;i--) f[i-1]=f[i]-g[i];
	for(int i=s+1;i<=n;i++) f[i]=f[i-1]+g[i];
	for(int i=1;i<=n;i++) cout<<f[i]<<'\n';
	return 0;
}

P11588 题解

本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2025-11-21 08:01:46

题意

给定一个带颜色的括号序列,要求选出一个匹配子序列,使得相邻或匹配的括号颜色不同,求能选出的本质不同合法子序列数量。$n\le 700$。

题解

如果是下标不同子序列,可以设 $f_{l,r}$ 表示在 $[l,r]$ 内选,强制选 $l,r$ 且内部合法的方案数,之后区间 DP 转移。对于本质不同子序列,考虑最小表示,即对于某种子序列,每一位都尽可能靠前选。这样会限制选的相邻位置 $x,y$ 满足 $pre_y\le x$,其中 $pre_y$ 表示 $y$ 上次出现的位置。这样是局部限制,可在 DP 过程中满足,最终也只对不存在 $pre_l$ 的 $f_{l,r}$ 统计答案即可。

考虑转移,分为 $l,r$ 匹配和不匹配两种。前者枚举内部选的左右端点 $x,y$ ,不要求 $x,y$ 匹配,限制为 $c_l\ne c_r,c_l\ne c_x,c_r\ne c_y,pre_x\le l,pre_r\le y$;后者枚举与 $l$ 匹配的 $x$,再枚举 $x$ 后第一个左括号 $y$,要求 $l,x$ 匹配,不要求 $y,r$ 匹配,限制为 $c_l\ne c_x,c_x\ne c_y,pre_y\le x$。对于要求匹配的限制,额外开一维 $0,1$ 表示是否强制匹配即可,复杂度 $\mathcal O(n^4)$,常数很小。

尝试优化,发现对于方案中相邻的 $x,y$,固定 $y$ 时后缀 $x$ 合法,但固定 $x$ 时合法的 $y$ 没有规律,似乎不太容易直接前缀和优化。注意到转移时 $y$ 的限制只与 $x,r$ 有关,于是设 $g_{x,r},h_{x,r}$ 分别表示固定 $x,r$ 时,两种转移的合法 $y$ 对应值之和。此时 $f_{l,r,1}$ 只会贡献到 $g_{l,t}$ 和 $h_{t,r}$,也就是 $\mathcal O(n)$ 个值中。转移时枚举 $x$ 后可以 $\mathcal O(1)$,于是总复杂度为 $\mathcal O(n^3)$,好像常数还是不大啊。

代码

云剪切板

NOIP2025 游记

本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2025-11-30 12:00:11

我的痛苦不断在反复

生命就是硬走下这一条血路

请你不要落泪或是为我而恸哭

用失败欢呼

用烈火阐述

把你骄傲送入坟墓

——《“血路”

Day.-2(11.26)

几天前被甲流击倒了,在家歇着。

于是没去学校参加赛前动员活动,但在线上参与了蜂鸟合唱,爽了;但是有延迟,不爽了。

Day.-1(11.27)

还在家,鼓起勇气重做了击败我的 CSP 后两题。

我草怎么知道 T4 大体思路还做不出,红温了,看题解去了。

我草我读错题了,没有人类了,怪不得当时场上暴力都没写出来。

不过早就过去了,这种时候得知真相反倒更加释怀了。

Day.0(11.28)

上午还在家,三个小时速通了洛谷板子赛。

中午在服务区拦截了学校大巴,跟着一块到了酒店。

然后神人 chb 用智能音箱和电视大放 True Music,声音大到吵到了隔壁的曹神,无敌了。

晚上试机,同考场五个同校的?wfyz 蒸蒸日上啊。拍了个线段树就跑路了。

其余时间基本全在打塔,胡局忘防被心脏重击爆了,当攒 rp 了。

流感没完全好,本来想早睡来着,但还是拖到了十一点,不过睡得很好。

可这一瞬间你看见烟花在天空绽放

已不是触不及的远方

在这份悲伤盛开过后

你的心定能再次跳动

我知晓你还不应死去在今天

还要由花知晓春去秋来

——《无人愿聆听的歌

Day.1(11.29)

进场前比较紧张,毕竟 NOIP 挺重要的,也怕自己再出现 CSP 那种失误。不想死在这场比赛。

开场,大体浏览了一下,感觉结构跟去年很像啊。T1 这不是随便调整,跟去年比不了吧,十来分钟过了。

看 T2,读错题写了个神秘东西,过不了样例 1,遂发现读错了。还好只浪费了十来分钟,问题不大。之后就想到了做法,然而看起来就复杂完了。由于有 CSP 的前车之鉴,又冷静分析了一下,感觉确实想不出更好的做法了,于是开始写。

这个分讨 + 组合式子有点复杂的,越写越红温。一直告诉自己要冷静,推推写写修到十点多才过样例 1,然后样例 2 爆了。这下真红温了,于是上了个厕所冷静头脑,回来对着调了几个细节才过,此时大概十一点。

然后 T3T4 都想了想,胡出来了 T3 $\mathcal O(n^4)$ 的树形 DP,常数还很小。由于 CSP 的教训,决定直接开写。写完发现 $120$ 都跑不了?原来是删代码漏删了两重循环,难绷。我去怎么 $360$ 跑这么快,那可能有 $48$ 了啊。

然后时间不多了,于是决定直接拼好分,把 T4 的 $\mathcal O(n^2q)$ 和 AB 性质都写了。最后还剩半小时,发现 T3 加前缀优化之后能改成 $\mathcal O(n^2m)$,常数小点的话甚至能冲 $68$,前面的 $48$ 也会更稳。于是留了个备份就开始优化,结果可能是预处理之类的细节挂了,最后没调出来,怕常数变大也没改 vector 开数组冲 $m$ 较小的分。

快结束的时候自己复盘了一下,感觉自己这场的表现跟去年很像啊,都是过了前两题然后拼好分。不过今年 T1 简单不少,T2 难一些。预估 $100+100+[32,48]+40$,不挂的话至少不会退役了。

我们 终究会走散

他们 也不过虚幻

捻一抹红妆的她 还在追

泪花 转啊转

转不回来 她要的以为

重岩叠对

早已看不见 的那份纯粹

和曾经那个孩子 说再见吧

——《樱桃簪子

然后出场了,发现一车人被 T2 创飞,T3 很多人甚至不会多项式复杂度。这么看我分竟然还不低?不过同校高一选手似乎都有点寄,同级也有没发挥好的。看了看 QQ 发现很多大手子也寄了,T2 还是太吃心态了。别笑,你来你也过不了第二关

又去了去年那家烧烤店吃饭,感觉比去年人多了些,还是那句话,wfyz 蒸蒸日上啊。

晚上回家复现了下 T3,想看看能过多少,结果怎么全 WA 了?给我吓一跳,然后发现 $res$ 忘初始化了,赛时肯定写了。改完过了 $48$,不过发现代码里可能访问了 $-1$ 下标,希望没啥大问题吧。

读了不少游记,好多熟人都被创飞了,感觉因为抽象题在 NOIP 不幸退役非常可惜,也对好朋友们非常不舍。或许是比较幸运,我应该能继续备战省选,之后大概率还在 LCA 营训。最后祝大家,也祝我自己一切顺利吧。

我们

跌跌撞撞 寻觅一个方向

忘却了 禁锢思绪 还在过往挣扎

追逐着月亮 模糊了面颊

不在意 明天是否还有太阳

——「追逐月光」feat.诗岸

【听课记录】25.10-LCA-Week3

本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2025-10-15 15:18:12

10.08 DP

基本知识

DP 基础

  • 考虑方式:分界线(记录前一半对后一半的影响)、状态机(记录判定 / 计算过程的状态)。

  • 转移:跨层转移(相当于状态机可持久化) / 分步转移 。

DP 模型(组合模式 / 表示)

DP 优化

  • 最优化:单调性、凸优化等。
  • 计数:容斥、代表元、取补集等。
  • 构造 / 判定。

DP 维护

DP 值有特殊性,如 slope trick 等。

CF1943D2 Counting Is Fun (Hard Version)

题意

定义序列 $b$ 是好的当且仅当其可以通过若干次操作变为全 $0$,操作为选择 $l\lt r$ 进行 $[l,r]$ 区间减一。给定 $n,k,m$,要求长为 $n$ 的序列中 $a_i\in[0,m]$。求 $(k+1)^n$ 种可能的 $a$ 序列中有多少是好的,对 $m$ 取模。多组数据,$n,k\le 3000,\sum n^2\le 10^7$。

题解

令 $a_0=a_{n+1}=0$,显然若 $a_i\gt a_{i-1}+a_{i+1}$,则 $a_i$ 不可能被删空,序列一定不合法。若全满足条件,则序列一定合法,可以发现此时从左往右不断拓展,不够则新增区间,一定可以构造出合法解。

于是现在需要对 $a_i\gt a_{i-1}+a_{i+1}$ 的序列计数,容易记录最后两个值做到 $O(nk^2)$。接着观察性质,容易发现只有 $a_i\gt a_{i-1}$ 且 $a_i\gt a_{i+1}$ 的位置 $i$ 可能非法,而这些位置一定不相邻,考虑对这些位置单独转移。

具体地,当出现这种位置 $i$ 时,从 $f_{i-1,j}$ 直接转移到 $f_{i+1,t}$,带上 $a_i$ 种类数的系数 $\min(j+t,m)-\max(j,t)$。其余转移则需保证不存在这种位置,因此状态内需要记录 $[a_i\gt a_{i-1}]$。所有转移均是一段区间,只是有的与 $t$ 有关,讨论之后将一次函数贡献到 $f_{i+1},f_{i+2}$ 的区间内,使用差分和前缀和即可,总复杂度 $O(nk)$。

CF354D Transferring Pyramid

题意

给出一个金字塔,即第 $i$ 行只在前 $i$ 列有元素。可花费 $3$ 的代价覆盖单个格,也可花费 $\frac {x(x+1)}2+2$ 的代价覆盖一个高为 $x$ 的子金字塔,求将 $k$ 个格全覆盖的最小代价。$n,k\le 10^5$。

题解

显然最小代价不会超过全部单点改的 $3k$,于是 $x$ 也不会超过 $\sqrt k$ 级别。考虑对每一列 DP,设 $f_{i,j}$ 表示考虑了前 $i$ 列,第 $i$ 列上最高的三角高为 $j$ 的最小代价,第二维大小为 $O(\sqrt k)$。有 $f_{i,j}=f_{i-1,j+1}$,同时还能新开一个三角形,有 $f_{i,j}\leftarrow \min{f_{i-1}}+\frac {j(j+1)}2+2$。转移完后每个第 $i$ 列上的位置再对小于它的所有 $j$ 加上 $3$,这可以使用前缀和维护。总时间复杂度 $O(n\sqrt k)$。

P14016 ICPC 2024 Nanjing R\] 拓扑

题意

给出一棵树,对所有 $i$ 求 $p_i=i$ 的拓扑序数量。取模,$n\le 5000$。

题解

由于拓扑排序是从根到底的,考虑对此设计状态,设 $f_{u,i}$ 表示不考虑 $u$ 子树内除 $u$ 外的点时,$p_i=u$ 的拓扑序数量。由于 $u$ 子树内其他点必定在 $u$ 之后,不会改变 $u$ 的位置,答案为 $f_{u,u}\times {n-u\choose s_u-1}\times (s_u-1)!\times \prod_{v\in son_{u}} \frac{g_v}{s_v!}$,其中 $s_u$ 表示 $u$ 子树的大小,$g_u$ 表示只考虑 $u$ 子树的拓扑序数量,后面组成了多重集排列。

再考虑转移,由 $u$ 转移到 $v$ 时,考虑先用不在 $v$ 子树内的点排,设 $h_j$ 表示 $p_j=u$ 的方案数,有 $h_j=f_{u,j}\times {n-s_v-j\choose s_u-s_v-1}\times (s_u-s_v-1)!\times \prod_{t\in son_u,t\ne v}\frac{g_v}{s_v!}$,同样是多重集排列。此时有 $f_{v,i}=\sum_{j=1}^{i-1} h_j$,将 $v$ 插入对应位置即可,只要求 $u$ 在其前面。求 $h$ 只需要预处理后面一项的前后缀乘积,对 $h$ 前缀和优化即可做到 $O(n^2)$ 的复杂度。

本题启示我们按照过程设计 DP,从而设计出类似本题自根向下这种不常见的状态。

CF1608F MEX counting

题意

给出数组 $b$,求满足 $a_{i}\in[0,n],\left| c_i-b_i \right|\le k$ 的序列个数,其中 $c_i$ 为 $a$ 数组前 $i$ 个数的 MEX。$n\le 2000,k\le 50$。

题解

考虑设计状态,由于每个位置有自身的 MEX 限制,因此必定要记录 MEX,设 $f_{i,j}$ 表示考虑了前 $i$ 个数且 $c_i=j$ 的方案数。再考虑如何转移,发现 MEX 可能单次增长很多,需要关注两个 MEX 之间的数,这也是上个 MEX 之后大于 MEX 的数。于是设 $f_{i,j,c}$ 表示大于 MEX 的有 $c$ 种值已存在的方案数,为方便转移,这里不确定具体值,而是只确定有 $c$ 种。

转移时显然有 $f_{i,j,c}=(c+j)f_{i-1,j,c}+f_{i-1,j,c-1}$,后一项没有系数是由于状态定义里不确定具体值。该值在 MEX 增大时被确定,有 $f_{i,j,c}=\sum_{k\lt j} f_{i-1,k,c+j-k-1}\times\frac{(c+j-k-1)!}{c!}$,系数为 $A_{c+j-k-1}^{j-k-1}$,表示确定若干个数填充 $(k,j)$,注意这里 $a_i=k$ 是确定的。由于每个 $i$ 对应的 $j$ 在一段长不超过 $2k$ 的区间内,总状态数 $O(n^2k)$,转移复杂度 $O(k)$,总复杂度 $(n^2k^2)$,难以通过。

复杂度瓶颈在 MEX 增大的转移,注意到该式中后两维之和均为 $c+j-1$,考虑对其进行前缀和优化,设 $g_{x,y}=\sum_{j+c=x,j\le y} f_{i-1,j,c}\times c!$,则上式可变为 $g_{c+j-1}$ 的一段区间除以 $c!$,这是能 $O(1)$ 计算的。上面的前缀和数组大小为 $O(nk)$,于是总复杂度为 $O(n^2k)$,空间可以使用滚动数组优化到 $O(n^2)$ 甚至 $O(nk)$。

本题启示我们不要只对过程考虑,也可直接考虑最终的解集本身,从而发现更加优秀的状态设计方式。

10.10 DP

  • 有后效性的问题

环上 DP 可钦定结尾情况断环为链。

计数 / 概率期望类 DP 可列出包含自身的转移方程,移项得到真正的转移式。

最值类转移方程,如 $f_i=\max (t_j)$,可转为限制 $f_i\ge t_j$ 并最小化 $f_i$ 的值,这和差分约束的思想相似。之后用 Bellman-Ford 等算法硬跑也行。当转移中加的值非负时也可以用 Dijkstra 进行转移。

CF713E Sonya Partymaker

题意

有一个长为 $m$ 的环,上面有 $n$ 个关键点,要求给每个关键点钦定一个方向,使得向该方向延伸 $l$ 长度后覆盖环上每个点,求 $l$ 的最小值。$n\le 10^5,m\le 10^9$。

题解

显然答案可二分,转为判断是否能用长为 $x$ 的线段全部覆盖。设相邻两点间最多隔了 $d$ 个点,答案一定在 $[\lceil\frac d2\rceil,d]$ 内,于是二分上界设为 $d-1$ 即可。设 $b_i$ 表示 $i$ 点与下个点之间隔的点数,通过平移使得 $b_n=d$,于是 $1,n$ 均不能独立覆盖 $b_n$,方便断环为链。

考虑使用 DP 解决,设 $f_i$ 表示前 $i$ 个点覆盖 $i$ 点之前所有点后,最多向后延伸的距离。初值分 $1$ 的方向讨论,若 $1$ 向前则有 $f_1=0$,此时若 $f_n+x\ge b_n$ 则 $x$ 合法;若 $1$ 向后则 $2$ 必向前,否则 $n$ 无法独立覆盖 $b_n$,于是有 $f_2=\max(0,x-b_1-1)$,此时若 $f_n+f_2\ge b_n$ 则 $x$ 合法。

转移时同样对 $i$ 的方向分讨,若 $i-1$ 可延伸到 $i$ 前则可向右,即 $f_{i-1}\ge b_{i-1}$ 时 $f_i\leftarrow x$;若 $i-1$ 和 $i$ 可拼接则拼接,即 $f_{i-1}+x\ge b_{i-1}$ 时 $f_i\leftarrow 0$;若 $i-1$ 向右延伸出来,需要 $i-2$ 和 $i$ 将它们中间的部分覆盖,即 $f_{i-2}+x\ge b_{i-2}+b_{i-1}+1$ 时 $f_i\leftarrow \max(0,x-b_{i-1}-1)$。感觉转移有点重复,但这样至少是对的,单轮复杂度线性,总复杂度 $O(n\log n+n\log V)$。

  • DP 整体维护

    • 连续段

例如若干次令 $a'i=\max{j=i}^{i+k-1}a_j$ 或 $a'i=\min{j=i}^{i+k-1}a_j$,考虑维护所有值相同的连续段,并记录其相邻大小关系,则取最大值时所有比前面大的段左移 $k-1$,否则比前面小的段左移 $k-1$,若某个段被覆盖就删掉。可用堆等数据结构维护之。

    • 数据结构

若有 $O(n^2)$ 的 DP 状态 $f_{i,j}$,然而其从 $i-1$ 到 $i$ 的变化是区间修改等可维护的操作,可以直接使用数据结构维护目前的 $f_i$。

    • 观察整体过程

例如给出长为 $l$ 的串 $s$ 和其栈消除后的串 $t$,$s$ 中有部分位置不确定,对 $t$ 的每个前缀求其对应的合法 $s$ 个数。把图画出来后发现 $s$ 中确定时所有状态均整体平移,否则所有状态指向两边。于是删掉所有平移的行后只剩杨辉三角,可直接组合数计算。

[AGC017F] Zigzag

题意

有一个 $n$ 行网格,一条折线可用长为 $n$ 的数组 $x$ 表示,要求 $x_1=1$,且 $x_i$ 为 $x_{i-1}$ 或 $x_{i-1}+1$。要求选出 $m$ 条折线,另有若干 $x_{i,j}=x_{i,j-1}+c$ 的限制,求合法折线方案数。$n,m\le 20$。

题解

每条折线事实上可以用一个长为 $n-1$ 的 $01$ 串表示,于是设 $f_{i,S}$ 表示考虑了前 $i$ 条折线,第 $i$ 条折线为 $S$ 的方案数,复杂度至少是 $O(4^nm)$。考虑转化为向 $m$ 行 $(n-1)$ 列的网格内填入 $01$,某些格的取值有限制,且要求每行做前缀和后每列不降。

由此可设计轮廓线 DP,设 $f_{i,j,S,p}$ 表示考虑到 $(i,j)$ 位置,轮廓线上的状态为 $S$,且 $(i-1)$ 行前 $j$ 个的和为 $p$ 的方案数,转移是 $O(1)$ 的,于是复杂度为 $O(2^nn^2m)$。考虑避免对 $p$ 额外开一维状态,若在填第 $i$ 行,则每出现一次 $a_{i,j}=1,a_{i-1,j}=0$,后面就可以出现一次 $a_{i,j}=0,a_{i-1,j}=1$,即只有之前领先才能在该列少走。

于是令 $S$ 的含义变为前 $j$ 个表示第 $i$ 行的情况,后面表示之后填到该位置是否能填 $0$,为 $1$ 则不能填 $0$。每次上一行为 $0$ 且该行填 $1$ 时,将后面最近的 $1$ 改为 $0$,表示可以在此处填 $0$ 了。之后若在这种位置填 $0$,则可以消掉贡献;否则又满足修改的限制,会将下一个 $1$ 改为 $0$,于是这样的正确性有保证,时间复杂度降为 $O(2^nnm)$。

本题启示我们要关注整体变化过程,从而设计状态。

    • 方案点集

将所有可达状态放到坐标系中,只保留没被偏序的点。如果是凸的则可以使用闵可夫斯基和或 slope trick 等进行维护。

  • 插值

当 $n$ 很大,需要分讨但每种的答案均为低次多项式时,可枚举足够大的若干个 $n$ ,暴力计算 $y$ 值后插值计算出一个低次多项式,再代入 $n$ 求解。

或者 DP 状态数不太多,但存在背包转移且转移次数较多时,可先去掉背包维状态改为多项式,之后带入状态数个 $x$ 只维护多项式的点值,最后再插值出结果。

10.10 思考题 大鱼吃小鱼

鸽了。整个部分大概都需要观察到极长可吃区间是 $\mathcal O(n)$ 级别的,之后应该会做。

[ARC189D] Takahashi is Slime

P9530 [JOISC 2022] 鱼 2

U477940 大鱼吃小鱼

10.12 凸优化

查看 $(p,q)$ 点和直线 $y=kx+b$,相当于 $(k,-b)$ 点和直线 $y=kp-q$,这是半平面交和凸包的对偶关系。

斜率优化的双线性型一定满足四边形不等式,于是具有凸性。

一般来说带凸性的 DP,每个位置的最优决策点单调变化。

  • 凸性证明 1:考虑答案结构,用闵可夫斯基和归纳出其凸性。

U72600 【模板】wqs二分1

题意

给出正整数序列 $a$,每段的代价定义为区间和的平方,划分的代价定义为每段代价的和,求将其划分为 $k$ 段的最小代价。

题解(凸性证明 2)

当且仅当 $\frac {f(x-1)+f(x+1)}2\ge f(x)$ 时函数是凸的。于是考虑将 $x-1,x+1$ 的最优解拼起来,再转化成 $x$ 段的一个解,从而证明其不优于 $x$ 段的最优解 $f(x)$。

考虑找到分界线 $p$,使得将后一半交换后两个解均为 $x$ 段。由于 $p=0$ 时差为 $2$,$p=n$ 时差为 $-2$,且段数差连续变化,根据介值定理一定存在差为 $0$ 的时刻,于是可以变成两个 $x$ 段的解。

由于要证明大小关系,考虑找到一个和 $f'$ 使得 $f(x-1)+f(x+1)\ge f'$,从而可用 $f(x)$ 定义得到 $\frac {f'}2\le f(x)$,证明上面的式子。由于该代价满足四边形不等式,因此只要找出使得上下存在包含关系的分界点 $p$ 即可。由于差连续变化,一定存在连续的 $-1,0,1$,将 $p$ 取在此处即为包含关系,此时上式由于四边形不等式成立,于是证明了 $\frac {f(x-1)+f(x+1)}2\ge f(x)$,从而说明该函数具有凸性。

至于四边形不等式的证明,考虑 $a\lt b\lt c\lt d$,要证 $(s_d-s_{a-1})^2+(s_c-s_{b-1})^2\ge (s_c-s_{a-1})^2+(s_d-s_{b-1})^2$,拆括号化简之后得到 $-2(s_ds_{a-1}+s_cs_{b-1})\ge -2(s_cs_{a-1}+s_ds_{b-1})$,由于 $s$ 不降,根据排序不等式即可证明该结论。

  • 引理:当段数权值满足四边形不等式,则最优解关于段数是凸的。证明同上。

P2619 [国家集训队] Tree I

题意

求 $n$ 点 $m$ 边的图包含 $k$ 条白边的最小生成树。

题解(凸性证明 3)

考虑证明函数上每个点均能被切到,则需证明斜率 $k$ 变化过程中,方案的段数是连续变化的。更进一步地,在本题中对于一个斜率 $k$,需要证明可能为最优的白边数量是一个连续段。根据各种调整可以证明该结论,我不会此处略去。

上面两题都满足答案 $f(k)$ 关于 $k$ 是凸的,可使用 wqs 二分求解,复杂度 $O(T\log V)$,其中 $T$ 为单轮复杂度,两题分别为 $O(n)$ 和 $O(m\lpha(n))$。

  • 凸性证明 4:反悔贪心问题每次选择不如之前优,于是差分数组单调,天然具有凸性,比如模拟费用流。

LOJ6914. 爱上火车

凸优化,感觉过于难了,遂弃之。

AGC068C 题解

本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2025-10-17 09:19:32

模拟赛搬这个题,过于困难,拼尽全力无法战胜。

题意

有 $n$ 个球和 $n$ 个盒,编号均为 $1$ 到 $n$,初始可任意将球放到盒内。要求对 $i$ 从 $1$ 到 $n$ 依次操作,每次拿出 $i$ 盒内的球并任意排列成 $p_k$,之后同时将所有 $p_j$ 球放到 $p_{j+1\bmod k}$ 盒中。给出最终每个球所在盒的编号 $a_i$,判断是否可能出现该最终局面。多组数据,$\sum n\le 2.5\times 10^5$。

题解

发现顺序操作时自由度太高了,初值和过程中的排列顺序均难以确定,于是考虑倒着做,这样初始状态确定了。将状态用图表示,即球编号 $i$ 向所在盒编号 $a_i$ 连边,形成基环树森林。则对 $i$ 操作时所有指向 $i$ 的点均断开,再以任意顺序连成一个环;倒过来考虑时即找到一个环,将其断开并全部指向 $i$。

注意到上述两操作并不等价,原因是前者要求取所有指向 $i$ 的点,而后者没有限制这一点。仔细思考后发现只有两种情况合法,分别是 $i$ 点入度为 $0$ 或 $i$ 点在环上且入度为 $1$。前者可任意选环操作,后者必须选 $i$ 点所在的环,这对应操作前 $a_i=i$ 形成自环,会将其操作后环上前驱代表的球留在 $i$ 盒内。

于是出现了新的自由度:$i$ 点不在环上时可任意选环。猜想选 $i$ 所在连通块的环最优,手推发现选其他环时,除 $i$ 点外所有点的可操作性均不变;选所在连通块的环时,$i$ 点到环路径上入度只比限制多 $1$ 的点由不可操作变为可操作,其余点仍不变,于是这可能使局面变得更可操作,一定是最优的。

于是有了一个确定过程:从初始 $(i,a_i)$ 形成的图开始,倒序操作所有 $i$。每次先检查入度是否合法,不合法则无解;否则找到该连通块内的环,将其断开并全部指向 $i$,过程中修改入度。若能进行完 $n$ 次操作则有解。直接模拟该过程,暴力跳后继找环,复杂度可证明不超过 $O(n\sqrt n)$,事实上跑得特别快,证明如下(By Kevin090228):

每次操作遍历操作点到环路径上和环上的所有点。由于路径上的点在操作后会变到环上,只分析每次操作环长 $L$ 的总和即可,即复杂度为 $O(\sum L)$。设局面 $S$ 的势能 $V(S)=\sum r_i^2$,即所有点入度的平方和。操作会使环上点的入度减 $1$,势能减小 $\sum_{t\in C} r_t^2-(r_t-1)^2=\sum_{t\in C} 2r_t-1$,由于全局入度和为 $n$,这是不超过 $2n$ 的;同时操作点 $x$ 入度增加环长 $L$,势能增加 $(r_x+L)^2-r_x^2=2Lr_x+L^2$,这是不低于 $L^2$ 的。

由于势能 $V(S)$ 上界为 $n^2$ 且 $n$ 次操作总减小量不超过 $2n^2$,总增加量一定不超过 $3n^2$。忽略 $2Lr_x$ 这一项,有 $\sum L^2\le 3n^2$,根据柯西不等式可得 $\sum L$ 至多是 $n\sqrt n$ 级别的,于是复杂度 $O(\sum L)$ 不超过 $O(n\sqrt n)$。

还有另一种做法,考虑进一步刻画合法局面,注意到操作点 $i$ 时要求 $i$ 没有环外入度,因此对于 $i$ 点不在环上的前子树 $u$,若其所有点编号均小于 $i$,则 $i$ 点操作前该子树不变,$i$ 点会由于 $(u,i)$ 存在而无法操作,必然无解。于是对于每个点 $i$,其每个子树 $u$ 最大值 $w_u$ 均需满足 $w_u\gt i$,才有可能有解,这是一个必要条件。

至于充分性,感性理解若满足条件,则每个子树内都有点操作过,从而 $(u,i)$ 这条边曾被纳入环中,不再构成限制,因此 $i$ 点此时可以操作,不太会严格证明。总之这个条件是充要的,据此可判断合法性,DFS 即可找出环并求出所有 $w_u$,时间复杂度 $O(n)$,然而没跑过上种做法

【听课记录】25.10-LCA-Week4

本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2025-10-19 08:27:14

10.15 树上问题

  • 连通块

特殊情况:路径、邻域(邻居)。

统计方式:按 LCA 分类(树上启发式合并)、按分治中心分类(树上分治)、连通块性质(点边容斥)。

  • 虚树

点之间的拓扑关系。

P7735 [NOI2021] 轻重边

题意

给定一棵树,初始全为轻边。修改给出 $x,y$,将该路径上的边改为重边,路径上的点直接连接的其他边改为轻边,查询求 $x,y$ 路径上的重边数量。多组数据,$T\le 3,n,q\le 10^5$。

题解

需要用支持路径修改的方式刻画重边,考虑每次将路径覆盖为同一个值 $i$,于是重边定义为两端值相同的边,其余为轻边。注意到只要初始值和每次操作的值两两不同,这样的定义就是正确的。于是直接树剖 + 线段树维护路径覆盖,求路径上相邻相同值的对数即可,复杂度 $\mathcal O(q\log ^2n)$。

另一种做法是考虑轻重边转化的次数,注意到一条边 $(u,f)$ 为重边需要某次操作的两点分别在 $u$ 子树内外,而改回轻边需要存在 $u$ 的兄弟 $v$,使得某次操作的两点分别在 $v$ 子树内外。这样改回轻边的次数与树上启发式合并的复杂度同级,为 $\mathcal O(n\log n)$。

于是需要支持路径改为重边,快速查询路径相邻的轻边位置并单点修改。好像可以直接存每个点到根第一条轻边,再把原树每条重链所挂的当前重边存下来。具体没有实现,不管了。

P9886 [ICPC 2018 Qingdao R] Kawa Exam

题意

给定一张无向图,每个点有颜色 $a_i$,对每条边求将其断掉后所有连通块同种颜色的最大出现次数之和。多组数据,$n,m\le 10^5,\sum n,\sum m\le 10^6$。

题解

原图的答案容易求,显然若连通情况不变,则最终答案也不变,于是只有断掉割边会改变答案。可以先将每个边双缩成一个点,形成一个森林,变成求断开森林中某条边后的答案。设 $f_u$ 表示 $u$ 子树的答案,$h_u$ 表示 $u$ 所在树除掉 $u$ 子树的答案,则 $u$ 点连向父亲的边断开的答案为 $res-f_{rt}+f_u+h_u$,其中 $rt$ 表示 $u$ 所在树的根节点。

现在需要求出 $f,h$ 两个数组,考虑使用树上启发式合并,依次求出所有轻儿子的答案并清空信息,最后求重儿子的答案并保留信息,再暴力将轻儿子的信息全部加入求当前点的答案,这样的总复杂度是 $\mathcal O(n\log n)$ 的。注意轻重儿子的划分需要用子树内的原图点数,不能用缩点后的点数,否则复杂度没有保证,这是因为每次增删信息需要枚举原图的所有点。细节较多,一遍过了,爽。

P5411 [SNOI2019] 网络

首先一定会选一个直径不超过 $d$ 的连通块,于是需要对每个点求以其为中心的连通块总延迟。这个需要启发式合并和长剖?反正难写完了,遂弃之。

  • 直径

P4220 [WC2018] 通道

有随机化做法,即每次对一个点找最远点,重复足够多遍即可取到答案。确定性做法的话先考虑两棵树,此时对第一棵树边分治,将该轮考虑到的点在第二棵树中建出虚树,带上第一棵树中到分治中心距离的权,在上面 DP 即可。三棵树时再套一层分治,比较难写。之后学了边分树应该会写。

10.17 图上的树

  • DFS BFS 树

放到图论里讲。

  • 最小生成树

P4208 [JSOI2008] 最小生成树计数

题意

给出一张 $n$ 点 $m$ 边的带权无向图,求其权值和最小的生成树个数。$n\le 100,m\le 1000,w_i\le 10^9$,保证同一种 $w_i$ 的边数不超过 $10$。

题解

考虑 Kruskal 的过程,即依次考虑每种权值,并在不成环的前提下加尽可能多的边,且考虑到某种权值时连通情况是固定的。对每种权值将之前形成的每个连通块看成一个点,求连边数量最多且不成环的方案数。由于同种权值边数 $c_i$ 不超过 $10$,可以直接 $2^c$ 枚举,总复杂度大概 $\mathcal O(m\log m+2^cm)$。

如果没有同种边数量的限制,可能需要矩阵树定理解决,不会,摆了。

QOJ9904 最小生成树

题意

给定 $a$ 序列,$n$ 个点的完全图上 $(i,j)$ 边权为 $a_{i+j}$,求该图的最小生成树。$n\le 2\times 10^5,a_i\le 10^9$。

题解

考虑 Kruskal 的过程,于是先对和 $x$ 按 $a$ 从小到大排序,之后依次处理和固定的每种边。由于连边次数为 $n-1$,只需要快速找出需要连的边即可。注意到事实上是对 $[1,x-1]$ 和其左右翻转后的序列对应位置连边,这启发我们维护所在集合并寻找不同位置。

具体地,使用启发式合并的并查集实时维护所在集合,总复杂度 $\mathcal O(n\log n)$。使用树状数组维护正反哈希值,可二分出第一个不同位置,总复杂度 $\mathcal O(n\log ^2 n)$。由于并查集修改时树状数组要同步修改,此时修改的总复杂度也是 $\mathcal O(n\log ^2n)$。

事实上,如果只讨论修改,使用线段树同时修改 $m$ 个节点的复杂度为 $\mathcal O(n\log \frac nm)$,或许能分析到单 log 的总复杂度。不过不同位置很难在线段树上二分,查询复杂度不好降低,不管了。

QOJ4784 最小方差生成树

先拆一拆式子,根据方差的性质,将平均值替换成其他值一定不优。所以枚举平均值 $x$ 后用新的边权跑最小生成树,一定能取到答案,且不会比答案更优。然而本题还需要 LCT 之类的科技,所以弃了。

CF1550F Jumping Around

题意

数轴上有 $n$ 个点 $a_i$,只能在这些点之间移动,$i,j$ 点可直接到达当且仅当 $d-k\le \left|a_i-a_j\right|\le d+k$。给定 $d,s$,每次询问给出 $t,k$,求以 $d,k$ 为参数时 $s$ 是否能到达 $t$。$n,q\le 2\times 10^5,a_i\le 10^6$。

题解

考虑图论建模,以能使两点直接相连的最小 $k$ 为边权。注意到这样建图后走最小(瓶颈)生成树上的边一定最优,于是目标变成求该图最小生成树,再求路径最大值与给定 $k$ 比较即可。同时起点固定,甚至只需要一遍 DFS 即可求出所有路径最大值。

由于是完全图,考虑 Boruvka 算法,需要求某个集合内连向集合外的最小边。由于边权为 $\left|\left|a_i-a_j\right|-d\right|$,推一推发现距 $i$ 点连的最小边是离 $a_i-d$ 或 $a_i+d$ 最近的 $a_j$。于是用 set 维护所有的 $a_j$,处理当前连通块时将其内部的 $a_i$ 从 set 中删去再查询,总复杂度 $\mathcal O(n\log ^2 n)$。

LOJ6631. 「EC Final 2018」异国情调的……古城

上课没咋听懂,但感觉不是特别难且好题,之后应该会补。

  • 基于树的特殊图

外平面图:存在一个面与所有其他点都相连。此时除这个面外,其余面对偶图为树。

广义串并联图:可通过串并联结构缩成树。

弦图:图中任意超过三个点环中均存在至少一条弦的图。也可以用树上的连通块等价定义,以某个连通块为点,两个点连边当且仅当对应的两个连通块有公共点。

AT_joisc2017_f 鉄道旅行 (Railway Trip)

建模成图后在上面倍增,应该是好题,之后应该会做。

10.17 思考题 前 k 小问题和最小扩展过程

最小扩展过程

对于某些求第 $k$ 小方案的问题,将方案之间的关系建成树,边权为方案权值的差值,若满足以下几个条件,即可用最小扩展过程求解。

  • 每种方案对应且唯一对应树上某个节点。
  • 边权非负(即子节点权值不低于父节点)。
  • 每个点的出度足够小。
  • 每种方案可用足够少的信息刻画。

其中前两条保证正确性,后两条保证复杂度。若均满足,则以根节点为起始状态加入堆,每次从堆中取出最小权值,再加入其所有子节点方案即可。每个点出度不超过 $c$ 时复杂度为 $O(ck\log ck)$。

以上是完成了下面内容后的总结,下面是思考题的具体内容,似乎全都忽略了排序复杂度,不管了。

  • I. 给定两个 / 三个数组,求每个数组内选一个数求和后的第 $k$ 小值。

二分答案 $x$,双指针求不超过 $x$ 的个数来 check,复杂度 $\mathcal O(n\log V)$。三个数组时枚举前两个数组再双指针,复杂度 $\mathcal O(n^2\log V)$。

若 $k$ 较小,对每个 $i$ 维护当前指针 $j=p_i$,堆中维护 $n$ 个元素 $a_i+b_{p_i}$,每次取最小并更新指针,复杂度 $\mathcal O(k\log n)$。三个数组时先对 $a,b$ 求出前 $k$ 小数组 $t$,再对 $t,c$ 求第 $k$ 小,后一遍对每个 $c_l$ 维护指针,复杂度 $\mathcal O(k\log n)$。

  • II. 给定 $n$ 个非负整数,求前 $k$ 小子集和。

考虑一个搜索过程,若当前状态为 $S$,最后一个 $1$ 在 $p$,则可以从 $[p+1,n]$ 中随便找一个拓展并更新 $p$,只记录 $p$ 和权值即可。容易发现该过程形成一棵树,且满足开头所说的限制,直接套用做法即可。由于每个点最多有 $n$ 个子节点,复杂度 $\mathcal O(nk\log (nk))$。

为了降低度数,对整棵树进行左儿子右兄弟变换转成二叉树,发现新树的实际意义为加入 $p+1$ 或删去 $p$ 再加入 $p+1$,分别为连向第一个儿子和兄弟,同样维护即可,时间复杂度 $\mathcal O(k\log k)$。

  • III. 给定 $n$ 个非负整数,求大小为偶数的前 $k$ 小子集和。

同样先建出暴力转移,每次选 $[p+1,n]$ 中任意两个元素扩展并更新,每个点最多有 $\mathcal O(n^2)$ 个子节点,复杂度 $\mathcal O(n^2k\log (nk))$。

同样需要将出度减小,考虑每向外扩张两个时依次确定两个元素的位置,则需加一维 $0/1$ 记录 $p-1$ 是否被选。$p$ 可选上 $p+1,p+2$ 扩展到 $(p+2,1)$;若 $p-1,p$ 均被选,则可由 $(p,1)$ 改为 $(p+1,1)$,这是确定第一个元素位置;也可以直接将 $p$ 改为 $p+1$ 变为 $(p+1,0)$,即已确定第一个元素,开始单独移动第二个元素。可以发现仍然满足开头所说的条件,复杂度降为 $\mathcal O(k\log k)$。

  • IV. 给定 $n$ 个非负整数,有黑白两种颜色,求黑色元素个数为偶数的前 $k$ 小子集和。

直接分成黑白两部分,白色跑 II,黑色跑 III,分别求出前 $k$ 小子集和,之后使用 I 中 $k$ 较小时的做法合并起来即可。由于每一步都是 $\mathcal O(k\log k)$ 的,总复杂度也是 $\mathcal O(k\log k)$ 的。

  • V. 给定 $n$ 个非负整数,求大小为 $m$ 的前 $k$ 小子集和。

最小的初始状态为前 $m$ 小的和,于是考虑从后往前依次确定每个元素的位置。令状态 $(x,y,z)$ 表示前 $x$ 个数没动过,第 $x+1$ 个数目前是第 $y$ 小,第 $x+2$ 个数为第 $z$ 小,这是用来限制 $y\lt z$ 的。$(x,y,z)$ 可转到 $(x,y+1,z)$ 或 $(x-1,x+1,y)$,可以发现边权非负,时间复杂度 $\mathcal O(k\log k)$。

P2541 [USACO16DEC] Robotic Cow Herd P

题意(VI)

给定 $n$ 个长分别为 $m_i$ 的数列,求每个数列各选一个数的前 $k$ 小和。$n,k\le 10^5,m_i\le 10$。

题解

初始状态为每个数列最小值加起来,考虑依次确定每个数列所选的数。令状态 $(x,y)$ 表示 $x$ 之前的数列已确定选法,当前 $x$ 数列选第 $y$ 小,$x$ 之后的数列全都选最小。转移有 $(x,y)$ 转到 $(x,y+1)$,表示选更大元素,边权 $a_{x,y+1}-a_{x,y}$;转到 $(x+1,2)$,表示确定第 $x$ 行选 $y$,开始拓展第 $x+1$ 行,边权 $a_{x+1,2}-a_{x+1,1}$;另外当 $y=2$ 时可令第 $x$ 行选最小,即可以直接转到 $(x+1,2)$,边权 $(a_{x+1,2}-a_{x+1,1})-(a_{x,2}-a_{x,1})$。

不管是考虑实际过程还是看上面的边权,都需要 $a_{x,2}-a_{x,1}$ 不降,于是按照这个将 $m$ 个数列排序即可。可以发现满足所有要求,于是这样做是对的,复杂度 $\mathcal O(k\log k)$。

另外,Pigsyy 指出不选最小值的数列不超过 $\log k$ 个,这是由于若 $c$ 个数列选了非最小值,则权值不超过其的选法至少有 $2^c$ 种,而这不应该超过 $k$。然而没有想出用这个做的简单方法。

P6646 [CCO 2020] Shopping Plans

题意(VII)

给定 $n$ 个长分别为 $m_i$ 的数列,每个数列选数有个数限制 $[l_i,r_i]$,求满足限制的选数方案中前 $k$ 小的。$n,k,\sum m\le 2\times 10^5$。

题解

V 是 $n=1,l=r$ 的情况,先考虑拓展到 $l\le r$。在 V 做法的基础上,初始状态为 $(l-1,l,m_i+1)$,之后对形如 $(x-1,x,m_i+1)$ 且 $x\lt r$ 的状态新增转移 $(x,x+1,m_i+1)$,表示直接将选的数量增加 $1$ 即可。

再考虑对 $n$ 个数列做,注意到 IV 是 $n$ 个数列各选一个数的情况, 于是定义每个数列对应的新数列为其原数列所有选法的值,对新数列做 IV 即可。由于每个新数列被用到的元素不会太多,可以用多少求多少,复杂度得到保证,应该还是 $\mathcal O(k\log k)$ 的。

10.19 树上问题

Prufer 序列

考虑将有标号无根树扔到一个序列上,方式为每次找到编号最小的叶子节点,将其删去,并将其连接的点编号加入序列。这样操作直到只剩两个点,可得到一个长为 $n-2$ 的序列,即为 Prufer 序列。

该序列有一些性质,最后剩的点中必然包含 $n$,同时每个点在树上的度数为其在 Prufer 序列中出现次数加一。

根据 Prufer 序列也可以还原出一棵树, 方式是找到当前度数为 $1$ 的最小编号,它一定与序列开头元素连接,确定该边并将两点度数均减 $1$。以此类推即可还原整棵树,最后把剩余两点连起来即可。

这两个过程也是模板题的内容,实现上需要维护指针,指向当前度数为 $1$ 的编号最小的点,操作之后若其指向的点编号较小且度数降为 $1$,就直接继续操作,重复该过程直到度数不为 $1$ 或编号较大。根据两个过程,可以发现 $n$ 个点的有标号无根树与长为 $n-2$,值域为 $n$ 的序列形成双射,这也可以证明下面的结论。

下面是一些结论:

  • $n$ 个有标号点,无根树有 $n^{n-2}$ 种(Prufer 序列可证),有根树有 $n^{n-1}$ 种(前者定根)。
  • $n$ 个有标号点,有根树森林有 $(n+1)^{n-1}$ 种,方式是将所有根连到超级根 $n+1$,相当于 $(n+1)$ 个点的无根树种类数。
  • $n$ 个左部点 $m$ 个右部点的完全二分图,生成树个数为 $n^{m+1}\times m^{n+1}$。

考虑 Prufer 序列的生成过程,每个位置删点时方案数为对面的点数,而且属于哪一部分是自然钦定的,不用乘组合数,且最终剩的一条边也一定在两部分之间,于是可以得到上式。

  • 引理:$n$ 点有标号无向图有 $k$ 个大小为 $s_i$ 的连通块,连 $(k-1)$ 条边使其连通方案数为 $n^{k-2}\cdot \prod_{i=1}^k s_i$。

设 $d_i$ 表示 $i$ 连通块连的边数,有 $\sum d_i=2k-2$。根据 Prufer 序列性质,每个点在序列中的出现次数 $e_i=d_i-1$,有 $\sum e_i=k-2$。枚举 $e$ 序列计算,答案为 $\sum_{e_i\ge0,\sum e_i=k-2}{k-2\choose e_1,e_2,\cdots,e_k}\times \prod_{i=1}^k s_i^{e_i+1}$,提出 $\prod_{i=1}^k s_i$ 后剩余部分为多元二项式定理,为 $(\sum s_i)^{k-2}=n^{k-2}$,于是结论得证。

P11039 【MX-X3-T6】「RiOI-4」TECHNOPOLIS 2085

虚树相同,用上 Prufer 序列的推论计数,之后应该会写。

  • 树同构

P8499 [NOI2022] 挑战 NPC Ⅱ

很树同构的题,之后应该会做。

P9056 [集训队互测 2022] 在路上

随机选两点时重心在路径上的概率不低于一半,于是随机选之后通过某种方式在链上找中心,再判断是否是全树重心。之后应该会做。

25.10-LCA-Week5-8 模拟赛题解

本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2025-10-19 19:52:56

10.23

兵败如山倒。T3 Dijkstra 开成大根堆是什么玩意,T4 太难了不会,还挂了十分。还是要注意细节吧。

T3 暗符「Demarcation」(境界线)

题意

给出一个网格,给定起点和终点,每次移动会将当前位置标记为障碍,然后向某个方向走到障碍处停下,求走到终点的最少移动次数。$n,m\le 10^3$。

题解

考虑从起点开始走的情况,注意到通过来回走可以到达中间没有障碍的同行列点,代价从两边往中间递增,通过调整可证明以此为代价能取到最优解,且不会比答案小,直接 Dijkstra 可以做到 $\mathcal O(n^3\log n)$ 的复杂度,用 $n$ 个队列代替堆可以做到 $\mathcal O(n^3)$。事实上前者甚至都能过。

前缀和优化建图,注意到每个点向相邻所有点连 $2$,向一步能走到的点连 $1$ 即可表示整张图。Dijkstra 复杂度 $\mathcal O(n^2\log n)$,用 $3$ 个队列代替堆可以做到 $\mathcal O(n^2)$。

原题

AT_joisc2016_j

T4 暗符「Dark Side of the Moon」(月的阴暗面)

题意

给定一个长宽均为 $120$ 的网格,每个格有向下或向右的方向,初始均向右,且 $(0,0)$ 位置有标记。每个时刻所有标记按照所在格的方向移动,并将原位置的方向变成另一种,之后在 $(0,0)$ 生成一个新标记。$q$ 次询问 $t$ 时刻变化之后 $(x,y)$ 上是否有标记。$q\le 10^4,x,y\le 120,t\le 10^{18}$。

题解

太难了,补完还是不知道为啥要这么做。整个变化非常抽象,难以对一个时刻的局面考虑,于是计算前 $t$ 个时刻经过 $(x,y)$ 的标记总数,差分一下就能得到 $t$ 时刻是否有标记。只有前 $(t-x-y+1)$ 个标记能到 $(x,y)$ 点, 设 $f_{i,j}$ 表示经过 $(i,j)$ 点的标记数,有 $f_{0,0}=t-x-y+1$。显然若 $(i,j)$ 被经过 $x$ 次,有 $\lfloor \frac x2\rfloor$ 个会向下走,其余向右走,容易递推出 $f_{x,y}$,时间复杂度 $\mathcal O(\sum xy)$。

太难了。

原题

CF1733E

10.25

ICPC 赛制,三人三机打得还行,CSP 之后还得加练。

B. Beautiful Dangos

题意

给出一个三色序列,可以重排一个区间内的元素,要求最终序列相邻元素不同,求选择区间的最短长度,判无解。多组数据,$\sum n\le 2\times 10^6$。

题解

显然只有最大出现次数 $c$ 满足 $c\gt \lceil\frac n2\rceil$ 时会无解,初始合法也容易判断,先判掉。之后对于原序列所有相邻相等元素,操作区间至少要覆盖两个元素之一,于是找到最靠前和最靠后的这种相邻元素,取最靠前的后一个 $L$ 和最靠后的前一个 $R$,操作区间一定满足 $l\le L,r\ge R$。此处可能有 $L=R+1$,不过不要紧。

现在还需判断每个区间是否合法,对于某种颜色 $c$,设 $s_i$ 表示其在前缀中出现次数,则区间合法当且仅当 $s_r-s_{l-1}\le \lceil\frac{r-l+1-[a_{l-1}=c]-[a_{r+1}=c]}2\rceil$,移项并整理可得 $(r-[a_{r+1}=c]-2s_r)+(2s_{l-1}-l-[a_{l-1}=c])\ge -2$,设两个括号内分别为 $g_r,f_l$,合法条件就转化成了 $g_r+f_l\ge -2$,非常简洁啊!

之后对于最小操作区间 $[L,R]$,可以用这种方式判断三种颜色是否合法,可以发现最多只会有一种字符非法。对这种字符尝试将区间向两边扩展,可以发现 $f,g$ 分别单调,双指针即可求出最短的操作区间。至于构造方案,每次选当前剩余个数最大的即可,有多种最大的优先选 $a_{r+1}$ 就好了,复杂度 $\mathcal O(n)$。

K. Killing Bits

题意

给定两个从 $0$ 开始长为 $n$ 的排列 $a,b$,每次操作可以选择一个排列 $c$,更新 $a_i\leftarrow a_i & c_i$,这里是按位与运算。判断 $a$ 能否在任意次操作之后变成 $b$。多组数据,$\sum n\le 5\times 10^4$。

题解

首先若存在 $b_i$ 不是 $a_i$ 子集则一定无解,若 $a,b$ 相同则有解。对于其余情况,注意到只要存在 $c$ 满足所有 $b_i$ 均为 $c_i$ 子集则有解,否则无解。证明考虑只要存在这样的 $c$,就可以分别将 $b_i$ 换到对应位置上,此时另一边变成了 $b_i$ 的超集,合法性不变,一定存在解。于是这个条件是充分的,必要性不会证,不管了。

这时需要求是否存在合法的 $c$,此时相当于一个二分图完美匹配,左部点是 $n$ 种取值 $x$,右部点是 $n$ 个 $b_i$,$x,i$ 间连边当且仅当 $b_i$ 是 $x$ 的子集。考虑优化建网络流图,即建出中转点 $y$,对所有 $y$ 向每一位 $1$ 变为 $0$ 的子集连流量无穷的边,之后 $x,b_i$ 分别连向相等的 $y$ 即可。最后 Dinic 跑一下是否有完美匹配就行,复杂度能过。

10.27

整体还可以,严肃学习 T4 的 MEX 性质。T3 有更好写的做法,如果不写平衡树会有更长的时间做 T4。

T4 隋唐测试

题意

给出长为 $n$ 的序列 $a$,$q$ 次询问某个区间 $[L,R]$ 内长度不超过 $k$ 的子区间的最大 MEX。$n,q\le 10^6$。

题解

MEX 定义为未出现过的最小值,考虑将每个值贡献到所有区间上。将区间按照 $l,r$ 两维画到坐标系上,则每个 $x$ 未出现的极长区间 $[L,R]$ 会贡献到 $L\le l\le r\le R$ 这个矩形(三角形)内,相当于其内部每个点对 $x$ 取最小值。这样的极长区间共有 $\mathcal O(n)$ 个。

由于是取最小值,直接从小到大考虑每个 $x$,则会将 $(L,R)$ 右下角的所有没填过的点均填上 $x$。这个过程中填过的轮廓始终是一个左下到右上的折线,于是可以用 set 维护拐点快速处理。

另外,每个区域大概是一个倒过来的阶梯形,由于询问是一个贴着直线 $y=x$ 的梯形,只要该区域能贡献给某询问,则询问的梯形一定包含某个阶梯拐点。于是只用阶梯拐点 $(x,y,w)$ 计算即可,这个拐点数量也是 $\mathcal O(n)$ 级别的。

之后把询问的梯形拆成右上方的三角形和剩余的平行四边形,前者对应 $r-k+1\le x\le y\le r$;后者将平行四边形向下压,即以 $r-l$ 为纵坐标,可得 $y-x\lt k,l\le x\le r-k+1$。前者对 $r,y$ 扫描线后是后缀查询,可以树状数组;后者对 $y-x$ 扫描线后是区间查询,只能线段树。总时间复杂度 $\mathcal O((n+q)\log n)$。

10.29

最后一场了,出得有点烂,因为「斜二倍增」是树上算法的“新优选”!但是 T4 确实好题啊。

T3 树练习题

题意

给出 $n$ 个点,分别有点权 $a_i$。$q$ 次操作,每次随机出两个点 $u,v$,若不连通则加入边 $(u,v)$,连通则询问 $(u,v)$ 路径上点权的非空最大子段和。$n,m\le 3\times 10^6$。

题解

最大子段和是半群信息,也就是说题目要求支持动态加边的树上路径半群信息查询。考虑暴力做法,即每次取出对应路径暴力查询。此时需要维护每个点的深度和父亲节点,使用启发式合并更新即可。由于随机加边的期望树高为 $\mathcal O(\sqrt n)$,复杂度为 $\mathcal O(n\log n+q\sqrt n)$,能过不少。

考虑静态树上路径半群信息查询方式,树剖难以动态加点,考虑使用倍增。传统倍增每个点有 $\mathcal O(\log n)$ 的信息,套上启发式合并复杂度为 $\mathcal O(n\log ^2n+q\log n)$,空间也有 $\mathcal O(n\log n)$ 的复杂度,爆炸了。

于是使用斜二倍增,设 $w_i$ 表示 $i$ 向上跳 $F(d_i)$ 步的信息及其对应祖先。之后倍增求出 LCA,同时合并路径信息即可。这里 $F(x)$ 定义为后树上其管辖节点长度,可以倍增预处理。这样每个点只需要维护一个信息,时间复杂度降为 $\mathcal O((n+q)\log n)$,空间复杂度 $\mathcal O(n)$,可以通过。

原题

P14302

T4 无尽旅途

题意

若 $T$ 时刻在 $u$ 点,则该时刻结束时会传送到 $c_{u,T\bmod d_u}$ 点。给定 $c$,$q$ 次询问从 $T$ 时刻在 $u$ 起经过 $x$ 个时刻后停在哪个点。$n,\sum d\le 10^5,q\le 5\times 10^4$。

题解

这种问题考虑倍增,设 $f_{i,j,k}$ 表示在 $i$ 点且 $T\bmod d_i=k$ 的状态下走 $2^j$ 步到达的点。然而这个状态是有问题的,一旦走到 $d_u\gt d_i$ 的 $u$ 点,$k$ 记录的时间信息就不够用了,需要知道时刻对 $d_u$ 取模的结果。于是 $j$ 这一维需要开到 $\max d$,只能做到 $\mathcal O(nd\log V)$ 的时空复杂度,无法接受。

但由于 $d$ 为 $2$ 的整数次幂,一共只有 $\mathcal O(\log d)$ 种取值,于是信息不够用的情况只会发生这么多次。考虑改 $f_{i,j,k}$ 为走过 $2^j$ 个 $d$ 与 $i$ 相同的点时最终到达的点。由于可能卡在 $d_u\gt d_i$ 的点 $u$ 上,同时记录 $g_{i,j,k}$ 表示此时走的步数,这些信息容易按 $d$ 从小到大的顺序预处理。

查询时同样从高位到低位跳,如果被卡了就重新从最高位开始。注意过程中若跳不到 $d$ 相同的下一个点,需要暴力向后跳一步。显然被卡和暴力向后跳的次数均不超过 $\mathcal O(\log d)$,总时间复杂度为 $\mathcal O(\sum d(\log d+\log V)+q\log d\log V)$,空间复杂度为 $\mathcal O(\sum d\log V)$。

原题

P10198

11.06

CSP 之后第一场,感觉还行。T4 太难,胡出来一个比较假的做法,跟正解有点关系,但正解是人能想出来的吗?

T4 雪符「Diamond Blizzard」(钻石风暴)

题意

给出一个内向基环树,每个点有点权 $a_i$,每次更新将所有满足 $a_i\le a_{p_i}$ 的 $a_i$ 同时增加 $1$。$q$ 次询问 $d$ 次更新后 $a_g$ 的值。$n,q\le 2\times 10^5$。

题解

设 $f_{i,j}$ 表示 $a_i$ 在 $j$ 时刻的值,有 $f_{i,0}=a_i,f_{i,j}=f_{i,j-1}+[f_{i,j-1}\le f_{p_i,j-1}]$。考虑 $p_i=\min(i+1,n)$ 的特殊性质,显然 $f_{n,j}=a_n+j$。考虑从后往前推出所有的 $f_i$,首先 $f_{i,j}$ 关于 $j$ 的变化可以画到坐标系里,且只有 $0,1$ 两种斜率。

关注第一次满足 $f_{i,t}=f_{i+1,t}$ 的时刻 $t$,若 $a_i\le a_{i+1}$,则 $t$ 之前 $a_i$ 一直增加,否则 $a_i$ 一直不变。这部分斜率是相同的,可以区间覆盖实现。至于 $t$ 之后,有 $f_{i+1,j}\le f_{i,j}\le f_{i+1,j}+1$,具体取决于 $a_{i+1}$ 第 $j$ 次有没有增加,画到图像上大概会形成若干平行四边形。

之后思路不太像人。注意到 $t$ 之后部分的差分数组是位移得到的,具体来说是在 $i+1$ 的差分数组开头插入一个 $1$,之后整体向后平移一位,手摸一下可以发现该结论是对的。整体向后平移可能能用平衡树维护,但比较困难,没有尝试。

尝试避免向后平移。考虑将 $f_i$ 图像向左平移 $1$ 得到 $g_i$,注意到现在有 $g_{i,j}=f_{i+1,j}+1$ 了,可以区间加实现。然而前半部分维护的是斜率(即差分数组),好像还是很难做,考虑再将 $g_i$ 向下平移 $1$,于是有 $g_{i,j}=f_{i+1,j}$ 了,后半部分直接不用管了,赢。

然而细节仍然有一车,首要的就是给 $g$ 一个更好的定义。令 $i$ 的深度 $d_i=n-i$,我们令 $g_{i,j}=f_{i,j+d_i}-d_i$,这样就实现了 $i$ 图像相对于 $i+1$ 图像向左和向下分别平移了 $1$。同时由于用深度定义,这也可以拓展到树上。

当然这里需要维护 $g_{i}$ 的差分数组 $h_i$。重新画图讨论转移,发现此时 $g_i$ 图像的 $j$ 点向上走需要 $g_{i+1,j+1}$ 严格大于 $g_{i,j}$,这和题目条件 $f_{i,j-1}\le f_{p_i,j-1}$ 是一样的。手推讨论之后发现若 $a_i\le a_{i+1}$,则找到 $h_{i+1}$ 第 $(a_{i+1}-a_i)$ 个 $0$,此处之前全覆盖成 $1$,后面不变;否则 $a_i\gt a_{i+1}$,需要找到 $h_{i+1}$ 第 $(a_i-a_{i+1}-1)$ 个 $1$,前面全覆盖成 $0$,后面不变。这可以用线段树二分和区间覆盖实现,这样就完成了特殊性质的做法。

至于基环树,由于环上最小值一定会一直增大,可以从此处断环变成一棵树。树上的话每个点只会受到根链上的点影响,同样用线段树维护,出子树时撤销修改即可,时空复杂度都是 $\mathcal O((n+q)\log n)$。然后会发现空间爆了,我的做法是部分标记永久化,大概是在修改时正常下传标记,查询和二分时均不 pushdown,而是直接用函数传参记录根节点到当前点路径上第一个覆盖标记,这样撤销次数大大减小,可以通过。

当然好像有区间赋等差数列的做法,那就是直接维护 $g$ 数组了,应该差不多。

11.08

T3 爆了 lower_bound 返回值的语法错误,之后注意。T4 太神秘了,已严肃学习。

T4 学习

题意

给出一个森林,点有点权 $a_u$,边有边权 $b_u$。标记一个点需要花费 $a_u$ 的代价,若其父亲已被标记,也可以花费 $b_u$ 的代价。标记随时可清除,且不能同时存在超过 $k$ 个标记点。要求树上的 $m$ 个点均被标记过,求最小代价。多组数据,$T\le 30,m\le n\le 5000,k\le 5$。

弱化版:每个点只能被标记一次,$T\le 5,m\le n\le 10^5,k\le 10$。

题解

判掉 $k=1$,此时答案为 $\sum a$;将 $b_i$ 对 $a_i$ 取 $\min$,同时以 $0$ 为树根且不标记,避免讨论。考虑标记点形态,$k=2$ 时标记 $u$ 点后可向下拓展到子节点,但是需要清除 $u$ 点标记才能接着向下,最终能覆盖毛毛虫形状内的点。定义单点是 $1$ 合法的,对于 $i\gt 1$,定义 $u$ 子树 $i$ 合法当且仅当存在一个儿子 $i$ 合法, 且其他儿子均 $(i-1)$ 合法,这也能解释 $2$ 合法的形状。

于是对于弱化版,设 $f_{u,i}$ 表示 $u$ 子树内关键点均被标记过,且从 $u$ 开始的拓展过程 $i$ 合法的最小代价。状态不考虑 $u$ 点代价,因为其取值受父亲影响。另外令 $f_{u,0}$ 表示 $u$ 不选时的最小代价。转移为 $f_{u,1}=f_{u,0}=\sum\min(f_{v,k}+a_v,f_{v,0})$,对于 $i\gt 1$,有 $f_{u,i}=\min(f_{v,i}+b_v+\sum_{t\ne v}\min(f_{t,i-1}+b_t,f_{t,k}+a_t,f_{t,0}))$,只需先对第二个式子求和,再找最优差值更新即可。最后若 $u$ 必须被标记,将 $f_{u,0}$ 赋为正无穷,复杂度 $\mathcal O(nk)$。

对于原题,同一个点可被学习多次,即可以从 $u$ 拓展到 $v$,在 $v$ 拓展的过程中扔掉 $u$,之后需要标记 $v$ 或其他子节点时再把 $u$ 标记回来。据此设 $f_{u,i,j}$ 表示考虑 $u$ 子树,用到了至多 $i$ 的空间,过程中 $u$ 的子节点拓展需要 $u$ 点标记 $j$ 次的最小花费。与上面相同,状态不考虑 $u$ 点代价,这会在父亲节点上决策。

这个状态在定义什么?其包含子树内其他点的标记次数和方式,记录过程中的最大空间消耗和 $u$ 用于拓展的标记次数,以便向上转移。由于空间越大越可操作,$f_{u,i,j}$ 随 $i$ 增大单调不增。另外 $f_{u,i,0}$ 并非不标记 $u$,而是已经考虑的过程没有用 $u$ 拓展,还没有因此标记过 $u$。最终 $f_{u,i,0}$ 的值是无意义的,事实上代表的是 $i'\lt i$ 的 $f_{u,i',y}$,该状态也不能转移给父亲。至于真的不标记,再设 $g_u$ 表示 $u$ 不用于拓展时子树内最小代价,此时子树内其他拓展过程均可使用 $k$ 的空间,不用记录。

由于从某点开始同时向多个子树拓展不优,可以依次处理每个子树,这样可用空间更大。于是可依次将每个子树 $v$ 的信息拼到 $u$ 上。具体地,新拼上一个子树 $v$ 时,有以下几种转移($t_v$ 表示 $v$ 是否需要标记;均有限制 $i\ge 2,j\ge 0,y\ge 1$):

  1. $v$ 从 $u$ 拓展来,且拓展过程中一直保留 $u$,$v$ 标记 $y$ 次:$f_{u,i,j}+f_{v,i-1,y}+yb_v\rightarrow f'_{u,i,j}$。
  2. $v$ 从 $u$ 拓展来,且 $v$ 不用于向下拓展:$f_{u,i,j}+g_v+t_vb_v\rightarrow f'_{u,i,j}$。
  3. $v$ 部分从 $u$ 拓展来,过程中扔掉 $u$,$v$ 标记 $y$ 次,其中 $x$ 次从 $u$ 拓展:$f_{u,i,j}+f_{v,i,y}+xb_v+(y-x)a_v\rightarrow f'_{u,i,j+x}$,有限制 $0\le x\le y$。
  4. $v$ 不从 $u$ 拓展,标记 $y$ 次:$f_{u,i,j}+f_{v,k,y}+ya_v\rightarrow f'_{u,i,j}$;$v$ 不标记代价为 $g_v+t_va_v$,不如 2 优。
  5. $u$ 不向下拓展,$v$ 标记 $y$ 次:$g_u+f_{v,k,y}+ya_v\rightarrow g'_u$;$v$ 不标记:$g_u+g_v+t_va_v\rightarrow g'_u$。

最难理解的可能是转移 3,即 $v$ 用了全部的 $i$ 空间,此时每次从 $u$ 拓展都要重新标记 $u$。这里状态第三维记录的是用于拓展的标记次数,理解了这一转移大概就能理解状态设计的方式了。

至于初始值,开始的时候只有单点 $u$,所有值均为 $0$。$f_{u,1}$ 没有转移,注意到此时 $u$ 同样不能向下拓展,全部赋成 $g_u$ 即可。暴力实现的话,转移 2.4.5 的复杂度不超过 $\mathcal O(n^2k)$,可以接受;而转移 1 是 $\mathcal O(n^3k)$ 的,转移 3 不限制上下界是 $\mathcal O(n^4k)$ 的,均需优化。

对于转移 1,注意到是对所有 $y$ 取最小值,于是设 $h_{i}=\min(f_{v,i,y}+yb_v)$,转移就变成了 $f_{u,i,j}+h_{i-1}\rightarrow f'_{u,i,j}$。这样转移和 $h$ 的预处理都是 $\mathcal O(n^2k)$ 的了,可以接受。

对于转移 3,注意到下标变化只与 $x$ 有关,先用同样方法避免掉 $y$ 的枚举。具体地,对于确定的 $i,j,x$,会用 $y\ge x$ 的 $f_{v,i,y}+xb_v+(y-x)a_v$ 转移。将 $y$ 分离出来得到 $f_{v,i,y}+ya_v$,预处理其后缀最大值 $h_{i,y}$ 即可,复杂度同样是 $\mathcal O(n^2k)$ 的。之后转移为 $f_{u,i,j}+h_{i,y}+x(b_v-a_v)\rightarrow f'_{u,i,j+x}$。注意到 $j$ 一维显然不会超过子树大小,可以套用树形背包,复杂度就是 $\mathcal O(n^2k)$ 的了。

于是做到了 $\mathcal O(n^2k)$ 的时空复杂度, 单组数据就能过了。然而原题是 $30$ 组多测,根本不是人。不过还有常数优化!考虑一次 $i$ 合法的拓展,若新覆盖的点数少于 $i$,则其一定也是 $(i-1)$ 合法的,可以将其拼到某次 $i$ 合法的拓展上。因此一次 $i$ 合法的拓展至少新覆盖 $i$ 个点,于是 $f_{u,i,j}$ 的 $j$ 一维可限制 $j\le \lceil\frac {s_u} i\rceil$。加上这个常数大大减小,可以通过。

原题

P12777

弱化版:P12734

11.10

打得还行,T4 太鬼畜,随机扰动乱搞无法战胜。

T4 昡符「积木流彩」

题意

给定长 $n$ 宽 $m$ 的网格,保证 $n,m$ 均为奇数。局面定义为用 $1\times 2$ 的积木不重叠地铺成只剩一个空格,每次操作可选择当前空格相邻的一个积木,将其移动到该空格及原来某格内。给出初始局面和目标局面,构造操作序列实现两者间的转化。$n,m\le 2000$,要求操作序列长度不超过 $8\times 10^6$。

题解

将棋盘黑白染色,注意到空格始终在同种颜色的格子里,且每个积木均跨过两种颜色。考虑将局面建模成二分图匹配,黑白格分别对应左右部点,积木对应边。考虑初始和目标之间的关系,求出两个匹配的对称差,上面每个点度数不超过 $2$,只会形成环和链。又由于除空格外每个点度数恰为 $1$,所以只存在两图空格之间一条链,其余均为环。

再考虑操作在图上是什么,发现是从空格(失配点)起走一条非匹配边和一条匹配边,并将两者状态互换。于是先把上面所说的链走完,对称差中就只剩若干个环需要修改了。由于对称差中边的状态交错,环长也一定是偶数。

此时两个局面的空格位置相同,考虑在目标局面图上 DFS,遍历每个格子。一旦搜索到某个两局面中连边情况不同的格,说明该格在交错环上,此时立刻停止搜索并绕环走一圈,将该环转化到目标状态,同时空格也回到原点,再接着进行搜索。注意到整个图是一个连通块,DFS 会搜遍所有格,因此最终一定得到了目标状态。

至于操作次数,每次操作走两个点,每个点会搜到一次,搜完之后还有回溯,这部分不超过 $nm$ 次;清环操作经过每个点至多一次,这部分不超过 $\frac 12 nm$,总操作次数不超过 $\frac 32nm$,可以通过。

11.13

太困难了,T2 还不给大样例,暴力还挂了;T3 寒假做过同类题但还是没做出,大败而归了。

T2 毒瘤

题意

给定一个坐标系,初始有两个点一条边,所有边边权均为欧几里得距离。$q$ 次操作,修改加入一个新点 $c$,给出其坐标 $(x,y)$ 和两个点编号 $A,B$,保证 $A,B$ 间有边,之后加入 $A,c$ 和 $B,c$ 两条边;询问求两点间最短路。$q\le 10^5$。

题解

非常抽象地,考虑建一张新图,其中的点表示原图的边。加入一个点 $c$ 时,在新图中加入点 $(A,c),(B,c)$,并将这两个点向代表 $(A,B)$ 的点连边。显然每个点有唯一父亲,于是新图是一棵树。

考虑将原图中的路径长度表示到新树上,定义新树的一条路径权值为,找到新树路径的两个端点,对应回原图中的各两个点,记录两两之间的四条路径距离,前提是只经过该路径上对应边两端的点,且每条边至少经过一个点。

这样的话每次询问 $x,y$ 间最短路时,分别找出加入该点时对应的两条边,分别求四次树上路径信息,找到对应 $x,y$ 距离的值取 $\min$ 即为答案。有一些细节,若调到 LCA 之前的两个点与 LCA 在同一三角形内,需要特判直接走过去的情况。信息可以 $\min +$ 矩阵乘法维护,复杂度大常数 $\mathcal O(n\log n)$。

T3 异或

题意

给定序列 $a$,每次操作可以选择 $2\le i\le n$ 的 $i$,并修改 $a_i$ 为 $a_i\oplus a_{i-1}$。判断任意次操作后是否能使整个序列不降,若可以再求出单调不降序列数字种类数的最大值。多组数据,$T\le 30,n\le 10^4,a_i\lt 2^{30}$。

题解

手玩一下发现可对任意 $j\lt i$ 进行 $a_i\leftarrow a_i\oplus a_j$ 的操作,且不改变其他值。于是最终 $i$ 位置可以是 $a_i$ 异或上 $j\lt i$ 任意子集异或值。任意子集异或值可以用线性基维护,于是判定只需要贪心填最小数即可,每次求出 $U_{i-1}$ 内 $y\oplus a_i\ge f_{i-1}$ 的 $y\oplus a_i$ 作为 $f_i$,其中 $U_i$ 表示长为 $i$ 的前缀对应的线性基,可以做到 $\mathcal O(n\log V+\log ^2V)$,后者是线性基标准化的复杂度。

至于求最大值,考虑暴力 DP,设 $f_{i,j}$ 表示前 $i$ 个数内有 $(j+1)$ 种值时 $i$ 位置的最小值,用线性基支持同样操作即可转移,复杂度 $\mathcal O(n^2\log V+\log^2V)$。

注意到前缀线性基只有 $\log V$ 种,考虑对相同线性基整体转移。具体地,若 $i\in[l,r]$ 内的 $U_i$ 全相同,则在 $l$ 处暴力转移,这样的位置有 $\log V$ 个,复杂度 $\mathcal O(n\log^2V)$。对于 $[l+1,r]$ 内的转移,由于 $a_i$ 无法加入线性基,这部分的最终值均为 $U_l$ 中的任意值。

设 $d=r-l$,需进行相同的 $d$ 次转移,此时每次取相同数或线性基中后继最优。具体地,令 $f'{j}$ 表示目前 $(j+1)$ 种数的最小值在 $U_l$ 中的排名,$g'_j$ 表示转移 $d$ 次后最小值在 $U_l$ 中的排名,有 $g'_j=\min{j-d\le t\le j} f'_t-t+j$,用单调队列维护 $f'_t-t$ 即可快速转移。$f',g'$ 与值的转化需要在标准化线性基中查询排名和第 $k$ 小,总复杂度 $\mathcal O(n\log ^2V)$。

T4 符板

题意

给定 $n\times m$ 的字符矩形,有两个字符相同,方向不同的 $1\times l,l\times 1$ 矩形,需要在字符匹配的前提下密铺整个矩形,求合法矩形对应的 $l$ 集合。$n,m\le 1000$。

题解

注意到对于单个 $l$,合法字符串一定是第一列或第一行的前 $l$ 个字符,只需要考虑如何判断合法。对某个位置考虑,猜测若能横着填就横着填是对的。原因是若 $(i,j)$ 处能横着填,若这 $l$ 个位置均竖着填则模板串全同,否则若 $t$ 个位置竖着填,$(i+t,j)$ 开始横着填,则模板串前 $t$ 个字符相同且 $t$ 是其周期,模板串也一定全同。而模板串全同的情况只能覆盖全同的矩形,容易特判。

于是可以从左上到右下依次进行覆盖,若某个位置未覆盖则从此处开始分别向右、向下判断长为 $L$ 的串是否未被覆盖且合法,均不合法就寄了,否则能横着合法就横填,否则竖填。注意到字符矩形全同的情况也能判出来,不用特判。此时以 $\mathcal O(l)$ 的复杂度覆盖 $l$ 个点,所以单轮判断是 $\mathcal O(nm)$ 的。又由于只有 $n$ 或 $m$ 的因数可能合法,直接枚举就是小常数 $\mathcal O((d(n)+d(m))nm)$ 的,可以通过。

11.17

T2T3 是啥阴间,太困难。T4 倒是会但没调完,不管了。

T3 路标

题意

给定 $n$ 个长为 $m$ 的序列 $d_{i,j}$,表示 $\lfloor y_j-x_i \rfloor=d_{i,j}$,要求对于任意 $i,j$ 均有 $x_i\lt y_j$。求最多能选出多少行使得存在 $x,y$ 序列满足所有条件,保证答案不低于 $\frac n5$。$n\le 1000,m\le 200$。

题解

由于对答案大小有保证,可以随机某一行 $u$ 并钦定其必选,再尽量多选其他的。合法条件可转化为对于任意 $i,j$ 均存在 $e_{i,j}\in[0,1)$ 满足 $d_{i,j}=y_j-x_i-e_{i,j}$。然而最好让限制中不带 $x,y$,这样比较好处理。于是令 $a_{i,j}=d_{i,j}-d_{u,j}=x_u-x_i+e_{u,j}-e_{i,j}$,再令 $p_i$ 表示 $a_{i,j}$ 的最小值位置,有 $b_{i,j}=a_{i,j}-a_{i,p_i}=e_{u,j}-e_{i,j}-e_{u,p_i}+e_{i,p_i}\ge 0$。

由于 $d,a,b$ 均为整数且 $e\in[0,1)$,$b$ 数组只有 $0,1$ 两种取值。移项可得 $e_{i,j}=e_{u,j}-e_{u,p_i}+e_{i,p_i}-b_{i,j}$。于是需要存在 $e_{u,p_i}\in[0,1)$ 使得上式全在 $[0,1)$ 内,这要求 $e_{u,j}-b_{i,j}$ 的极差小于 $1$。又根据 $b_{i,j}$ 只有 $0,1$ 两种取值,这相当于要求所有 $b_{i,j}$ 为 $0$ 的 $e_{u,j}$ 小于 $b_{i,j}$ 为 $1$ 的 $e_{u,j}$。于是令 $S_i$ 为第 $i$ 行为 $1$ 的列号,要求选出最多的 $S$ 使得两两之间存在包含关系。

于是按 $1$ 的个数排序后 DP,单轮复杂度 $\mathcal O(\frac{n^2m}w)$,还要乘上随机次数的常数,这里取 $25$ 就过了。

原题

P14055

11.20

打得还行,手感火热!但是 T4 把没判特殊性质的暴力交上去了,之后要注意。

T3 幻幽「Jack the Ludo Bile」(迷幻的杰克)

题意

$n$ 条射线绕中心形成一个环,有 $m$ 条连接相邻两射线的线段,两端点到中心距离相等。初始选择某射线向外走,遇到线段时强制走到另一端。可以任意加入满足同样限制的线段,对每个 $i$ 求初始在 $i$ 射线上走,最终走到 $s$ 射线无穷远处需要加入的最少线段数。$n\le 2\times 10^5,m\le 5\times 10^5$。

题解

由于是强制走过线段,若按到中心的距离从大到小考虑,则每条线段相当于交换相邻两条射线的终点编号,要求即最终 $i$ 射线终点为 $s$。考虑按该顺序 DP,设 $f_{i,j}$ 表示考虑了前 $i$ 条给定线段,当前 $j$ 射线终点为 $s$ 的最小加入数,有初始值 $f_{0,i}=\min(\left|s-i\right|,n-\left|s-i\right|)$。

至于转移,先交换 $f_{i-1,t_{i}},f_{i-1,t_{i}\bmod n+1}$。之后还要考虑线段的加入,有 $f'{i,j}=\min f{i-1,k}+\min(\left|j-k\right|,n-\left|j-k\right|)$。由于只有两个位置变化,只需要尝试用较小值向外更新,并尝试更新较大值,可以做到单次 $\mathcal O(n)$,总复杂度 $\mathcal O(nm)$,答案即 $f_{m,i}$。

观察这个 DP 的形式,注意到差分数组只有 $-1,0,1$,否则一定可以更新,于是考虑维护差分数组 $g_i=f_{i}-f_{(i+n-2)\bmod n+1}$。设 $x=t_i,y=t_i\bmod n+1$,$g_y=0$ 时交换没有影响,以下以 $g_y=1$ 为例,$g_y=-1$ 是类似的。

首先考虑 $x$ 位置的变化,$f_x$ 先由于交换增加 $1$。此时若 $g_x=1$,则 $f_x$ 还会被上个位置拉回来,于是 $g_x$ 仍为 $1$,$g_y$ 变成 $0$;否则就拉不回来了,$g_x$ 增加 $1$,$g_y$ 变成 $-1$。至于 $y$ 减小对其他位置的影响,显然无法更新前面元素,画图可得从 $y$ 向后找到首个非 $1$ 位置 $z$,此前的 $f$ 值均会减一,在 $g$ 上的影响即 $g_z$ 增加 $1$。

这需要查询 $y$ 后面首个非 $1$ 位置,在 $g_y=-1$ 时是前面首个非 $-1$ 位置,用 set 分别维护两种下标,单点改的时候也修改 set 即可。另外若只考虑给定操作会将 $s$ 交换到 $t$,则一定有 $f_{m,t}=0$,从该位置按 $g$ 数组推出 $f$ 即为答案,复杂度 $\mathcal O(m\log n)$。

原题

P9447

T4 幻象「Luna Clock」(月神之钟)

题意

给出数组 $a$,可任意次操作交换 $a_i,a_{a_i}$,求能得到的本质不同序列个数。$n\le 10^6,1\le a_i\le n$。

题解

直接上图,肯定是个基环树森林,每次操作相当于选择 $i$,然后 $i$ 直接指向 $a_{a_i}$ 并将 $a_i$ 连成自环。考虑把整个过程看成对边打标记,操作 $i$ 时要求 $a_i$ 非自环,此时标记 $(i,a_i)$ 这条边,之后实际的 $a_i$ 变为一直跳后继直到跳过一条非标记边到达的点。

可以发现每种对边标记的方式几乎能与序列一一对应,先抛开这个几乎不谈,主要限制是每个点的入边只能选一条,于是大概是 $\prod (r_i+1)$。然而问题出在环上,上述过程是无法标记环上所有边的,同时每种只有一条未标记边的方案对应的序列相同。

于是考虑直接在环上所有边均被标记的情况下统计这种方案,并减去只有一条未标记边的方案数,即 $\prod(r_i+1)-\sum r_i$。后面一项是枚举环上每条边作为未匹配边,钦定其余边均选在环上,该边不选在环上的方案数。不在环上的点另外乘上 $\prod(r_i+1)$,得到一个连通块的方案数。将每个连通块的方案数乘起来即为答案,复杂度 $\mathcal O(n)$。

原题

CF1863G

11.22

还行,T3 或许应该做出来?之后这种和固定还是要考虑根号种不同值啊。

T3 再见了,所有的字符串

题意

给定一棵树,点有点权。$q$ 次询问给出序列 $b$,定义某个点的价值为根到其路径上的点权序列中,与 $b$ 序列完全相同的不重叠子串最大个数,求所有点的价值最大值。$n,q,a_i,\sum m\le 10^5$。

题解

先考虑链上单次询问,此时可 KMP 或哈希找到询问串的所有出现位置,之后需要满足相邻两个距离不小于 $m$,求最多能选多少。显然可以从左往右贪心,即先选最靠左的,之后依次选不低于上一个加 $m$ 的最小值。这个放到树上可以同样贪心,把方向改成从根到底即可。

于是对于 $m$ 均相同的情况,可以进行 DFS,维护当前点到根路径序列的哈希值,以及当前每种串的答案,出子树时撤销修改。由于每个点向上的字符串唯一,一共只有 $\mathcal O(n)$ 个串,用哈希表以这些串的哈希值为下标存储答案,单轮复杂度是 $\mathcal O(n)$ 的。

对于原问题,由于 $\sum m\le P=10^5$,询问串长种类数不超过 $\mathcal O(\sqrt P)$,于是直接跑这么多遍就是对的,复杂度 $\mathcal O(n\sqrt P)$,带哈希表常数,卡卡就过了。

原题

P11471

T4 再见了,所有的增量挑战

题意

序列 $a$ 初始全 $0$,每次操作可将某个前缀或后缀加 $1$,代价为长度,求使 $a_i\ge b_i$ 的最小代价。$n\le 10^6,a_i\le 10^9$。

题解

由于总代价与数组元素和相等,直接求和尽可能小的 $a$ 即可,现要判断 $a$ 数组是否能被前后缀加操作构造出来。考虑将 $a$ 数组变成全部相同,且使相同的值尽可能大,$a$ 数组合法当且仅当该值非负。于是对于所有 $a_i\gt a_{i+1}$ 的位置,必须进行 $i$ 前缀操作 $a_i-a_{i+1}$ 次,后缀同理,进行完这些操作后序列非负则合法。

事实上,前后缀中进行完一种操作后,序列最小值在某一端且不再改变,于是只考虑一个过程即可。对于前缀,共进行了 $\sum \max(0,a_i-a_{i+1})$ 次操作,需要开头非负。不妨加入 $a_0=P\gt a_i$,于是限制变为 $\sum_{i=1}^n\max (0,a_i-a_{i-1})\le P$。注意到对每个两侧均高于本身的极长连续段,将其整体增高 $1$ 会使得式子左边增加 $1$,用单调栈求出所有的连续段后贪心选择即可,复杂度 $\mathcal O(n)$。

11.24

在家乱打的,怎么一堆原。T4 感觉牛的。

T4 【列阵】打卡

题意

给定一张无向连通图。到达某点需要有至少 $a_i$ 的钱,之后可以花费 $b_i$,求在每个点各花费至少一次的最少初始钱数。$n,m\le 10^5$。

题解

注意到一定会在最后一次经过某点时花费,否则调整到最后一次一定不劣。之后考虑倒着做,这样只能走已经花费过的点,且进入某点至少需要 $c_i=\max(0,a_i-b_i)$ 的金钱。

考虑维护目前能到的点集 $S$,初始只包含起点(即原问题的终点),同时维护当前值 $x$ 和答案 $r$。每次从 $S$ 中取出 $c$ 最小的点 $u$,若 $x<c$ 则补到 $c$,$r$ 也要增加相同值。之后 $x$ 加上 $b_u$,并将 $u$ 从 $S$ 中删去,将 $u$ 未加入过 $S$ 的所有邻点加入 $S$。答案为所有 $r$ 的最小值加上 $\sum b$,枚举起点后可用堆维护,复杂度 $\mathcal O(n(m+n\log n))$。

注意到该过程与最小生成树很像,是按 $c$ 从小到大拓展的。于是按 $c$ 值建出 Kruskal 重构树,这样该过程可以变成从叶子跳到根。又注意到跳的过程中对于点 $u$,需要额外加的值 $x$ 需满足 $s_u+x\ge w_{fa_u}$,于是 $x\ge \max(w_{fa_u}-s_u)$,DFS 过程中记录根到当前节点的 $\max$ 值,对叶子节点的答案取 $\min$ 再加上 $\sum b$ 即可,复杂度 $\mathcal O(n+m\log m)$。

AT_wtf19_c2 题解

本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2025-10-22 09:55:09

题意

二维平面上有 $n$ 个黑点 $(x_i,y_i)$,其余点为白点。每次操作可任选两个整数 $x,y$,将 $(x,y),(x,y+1),(x+1,y)$ 三个点的颜色取反。要求最后只剩一个黑点,求该黑点坐标,保证有解。$1\le n\le 10^4,-10^{17}\le x_i,y_i\le 10^{17}$。

题解

先考虑值域较小的情况。尝试将点转化到同一条线上,取 $Y \le \min y_i$ 并选择 $y=Y$ 这条横线。观察转化过程,发现点 $(x_i,y_i)$ 会贡献到所有满足 ${y_i-Y\choose t}$ 为奇数的点 $(x_i+t,Y)$。根据 Lucas 定理的结论,该限制等价于二进制下 $t\subseteq (y_i-Y)$。

若将答案 $(x_0,y_0)$ 贡献到直线 $y=Y$ 上,最靠边的贡献点分别满足 $t=0$ 和 $t=y_0-Y$,即横坐标分别为 $x_0,x_0+y_0-Y$。于是将初始点暴力贡献到该横线上,再找到最靠边的黑点横坐标 $L,R$,答案即为 $(L,R-L+Y)$。时间复杂度 $\mathcal O(nV)$。

以上做法告诉我们,找到 $y=Y$ 上最靠边的黑点横坐标 $L,R$ 即可求出答案。由于所求 $L,R$ 分别对应 $t=0$ 和 $t=y_0-Y$,只需求出任意一个黑点横坐标 $X$,即可从高位到低位倍增求出 $L,R$。

具体地,对每个二进制位 $2^k$,若 $(X-2^k,Y)$ 仍为黑点,则 $y_0-Y$ 和当前 $t$ 该位均为 $1$,需要更新 $X\leftarrow X-2^k$,最终得到的值即为 $L$。对 $R$ 的求解是类似的,只需变减为加即可。判断某个点的颜色可以枚举所有初始点计算贡献,单次复杂度 $\mathcal O(n)$,总复杂度 $\mathcal O(n\log V)$。

于是目标变为找到横线上任意一个黑点。考虑对所有点按 $(x-y)\bmod 3$ 划分等价类,每次操作三个等价类内各取反一个点,三者的黑点数奇偶性均改变。又因为最终状态只有一个黑点,每个状态下都存在黑点数为奇数的等价类。

在该横线上同样划分等价类,找到奇数个黑点的等价类 $c$,再对其不断二分,每次向奇数个黑点的一侧递归,即可找到一个黑点。

二分中需求解的问题为:给定 $l,r,c$,求初始点贡献到横线上后,$[l,r]$ 区间内横坐标模 $3$ 为 $c$ 的黑点个数奇偶性。由于不关心具体个数,可对每个初始点分别求出贡献点数奇偶性。由于贡献点异或只会导致点数减少 $2$,这些奇偶性异或起来即为最终黑点数奇偶性。

于是分别对初始点 $(x_i,y_i)$ 求 $[l,r]$ 内有多少模 $3$ 为 $c$ 的 $X$ 满足 $(X-x_i)\subseteq (y_i-Y)$。对 $t=X-x_i$ 考虑,设 $f_{k,liml,limr,c}$ 表示填了 $2^k$ 及更高位,这些位上满足包含限制,是否仍然等于上下边界,当前值模 $3$ 为 $c$ 的数字个数奇偶性,直接数位 DP 即可,单次复杂度 $\mathcal O(\log V)$。

令 $V=10^{17}$,由于坐标绝对值不超过 $V$,可取 $Y=-V$。此时贡献点在 $[-V,3V]$ 内,答案 $x_0,y_0$ 满足 $x_0\ge -V,x_0+y_0\le 2V$,可推出 $y_0\le 3V$。若贡献到竖线 $x=-V$ 同样可得 $x_0\le 3V,y_0\ge-V$,于是答案坐标在 $[-V,3V]$ 之间,倍增和数位 DP 从 $2^{58}$ 开始即可。

关于复杂度,瓶颈在于二分找任意黑点的 $\mathcal O(n\log^2 V)$,倍增求 $L,R$ 的 $\mathcal O(n\log V)$ 不在瓶颈上。提交记录

【听课记录】25.10-LCA-Week5

本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2025-10-28 08:18:47

10.22 数据结构

  • 颜色段均摊

CF444C DZY Loves Colors

题意

有长为 $n$ 的序列 $a,b$,初始 $a_i=i,b_i=0$。操作对一个区间 $[l,r]$ 内的 $i$ 进行 $b_i\leftarrow b_i+\left|a_i-k\right|,a_i\leftarrow k$ 的修改,查询 $b$ 的区间和。$n,m\le 10^5,k\le 10^8$。

题解

由于 $a$ 有不同,对 $a$ 覆盖时 $b$ 的变化量不同,难以直接维护。然而区间覆盖是破坏性操作,会使得这段区间之后一直相同,可以使用势能线段树或颜色段均摊解决,前者即只对线段树上颜色相同的节点操作。

至于颜色段均摊,考虑维护 $a$ 序列所有极长连续相等段,每次只对整段操作,显然原来相等的 $a$ 得到的贡献相等,可以区间加解决。之后把 $[l,r]$ 变成新的一段。若有 $k$ 个段被完全包含,则会进行 $(k+2)$ 次区间加,且段数减少 $(k-1)$,于是区间加的总次数不超过 $3n+q$。使用线段树或树状数组维护区间加区间求和即可,复杂度 $\mathcal O((n+q)\log n)$。

CF1638E Colorful Operations

区间赋值操作启发我们使用 ODT。对于每种颜色再维护一个标记,元素被改变颜色时处理一下标记贡献的改变即可,大概是区间加单点求值,上树状数组就行。之后应该会写。

CF453E Little Pony and Lord Tirek

题意

每个位置有初始值 $s_i$,上界 $m_i$,单位时间的增加量 $v_i$。进行 $q$ 次操作,在经过一段时间后求区间 $[l,r]$ 内所有值的和并将其清空。$n,q\le 10^5$。

题解

若上次清空到求值经过了 $t$ 单位时间,当前值为 $\min(m_i,tv_i)$,分讨 $\lfloor\frac{m_i}{v_i}\rfloor$ 和 $t$ 的大小关系即可。注意到贡献只跟 $t$ 有关,于是考虑按上次清空时间进行颜色段均摊,这样每段内的 $t$ 相等,容易计算贡献。这样变成若干段区间的 $\min(m_i,tv_i)$ 之和,根据 $\lfloor\frac {m_i}{v_i}\rfloor$ 离线扫描线即可解决,复杂度 $\mathcal O((n+m)\log n)$。

P5066 [Ynoi Easy Round 2014] 人人本着正义之名

可以发现向前后位运算本质是一些连续的连续段内某一种段长度增长,另一种长度减短,使用平衡树维护所有连续段并打标记即可。为了防止段缩没,还需要记录区间内最短的两种区间长度,当出现长为 $0$ 的段时暴力找到并合并左右两段。太难写了还卡常,遂弃之。

LOJ6777「2021 营员交流」大毒瘤

可以维护火段和非火段,也是特别难写,还有分块做法。反正弃了。

  • 扫描线

UOJ637【美团杯2021】A. 数据结构

题意

给定序列 $a$,$q$ 次询问给出 $[l,r]$,求将 $[l,r]$ 内的数增加 $1$ 后整个序列的数字种类数。$n,q\le 10^6,a_i\le n$。

题解

首先不存在某数比存在某数好处理,这是因为存在时出现次数不确定,然而不存在就是出现次数为 $0$,于是用 $n-1$ 减去不存在的个数即为答案。之后考虑拆贡献,即对每个 $x$ 考虑选择哪些区间 $[l,r]$ 会导致不存在 $x$。

注意到这需要选的区间包含原序列的所有 $x$,且不能包含 $x-1$。前一个限制是二维平面上一个矩形,后一个限制是若干不交的矩形,且所有 $x$ 对应的矩形数量总和是 $\mathcal O(n)$ 的。于是枚举后一个限制的矩形并与前一个矩形取交,再进行矩形加单点查即可,扫描线 + 树状数组即可维护,复杂度 $\mathcal O((n+q)\log n)$。

牛客挑战赛某题

题意

给定三个序列 $a,b,c$,求所有 $l\le r$ 在三个序列上区间极差的乘积之和。$n\le 3\times 10^5$。

题解

直接扫,同时维护所有子集区间和即可实现某个序列的区间加,然后单调栈维护一下就行。没题写不了。

lxl 还说,线段树复杂度要分定位和计算两部分,一般来说定位部分比较慢,所以信息多一些对常数的影响不大,只要把信息压结构体里避免重复定位就行。

P11390 [COCI 2024/2025 #1] 教师 / Učiteljica

每个区间内 $k$ 种出现次数的存在性会形成 $2^k$ 种状态,通过容斥转化为求 $S$ 内的次数均不存在的区间数,之后再取补集变成存在至少一个 $S$ 内的次数的区间数,这个就可以直接矩形面积并求了,复杂度 $\mathcal O(2^kkn\log n)$。当然后半部分也可以不取补集,而是记录 $f_i$ 表示 $S$ 中存在的个数,然后扫描线求全局 $0$ 的数量,复杂度是相同的。之后应该会写。

某典题

题意

给出 $n$ 个区间 $[l_i,r_i]$,$q$ 次询问编号在 $[L,R]$ 内区间并的大小。$n,q\le 10^6$。

题解

扫描 $R$ 这一维,维护 $f_i$ 表示当前覆盖 $i$ 位置的区间最大编号,询问 $f_i\ge L$ 的 $i$ 个数(离散化后为权值和)。$f$ 的修改是区间覆盖,于是直接上 ODT,再开一棵线段树 / 树状数组维护每个 $L$ 的答案即可,复杂度 $\mathcal O((n+q)\log n)$,没题写不了。

10.24 扫描线

多标记问题:

先合并相邻同种标记,尝试交换相邻标记 / 去除无用标记,再考虑标记之间的合并以及信息与标记的合并,以此设计标记。

P3246 [HNOI2016] 序列

题意

给出序列 $a$,$q$ 次询问区间 $[L,R]$ 内所有子区间 $[l,r]$ 的最小值之和。$n,q\le 10^5$。

题解

考虑对 $R$ 扫描线,设 $f_i$ 表示当前 $[i,R]$ 的最小值,所求为 $[L,R]$ 区间内 $f_i$ 的历史和。首先 $R$ 移动时可以使用单调栈维护最小值的变化,需要做 $\mathcal O(n)$ 次区间加。之后需要求区间历史和,用任意一种方式维护就行,复杂度 $\mathcal O((n+q)\log n)$。由于 lxl 刚讲了推标记的方法,写了这个。

P8868 [NOIP2022] 比赛

是上题的双序列版本,lxl 说这种题只需要维护 $a,b,ab$ 的和就能做,之后应该会写。

CF997E Good Subsegments

题意

给出排列 $a$,$q$ 次询问区间 $[L,R]$ 内有多少个子区间 $[l,r]$ 为区间连续段,连续段定义为其在值域上连续,即 $\max-\min =r-l$。$n,q\le 1.2\times 10^5$。

题解

考虑求全局区间连续段数的做法,通过维护 $\max-\min-r+l$ 这个非负值并求最小值 $0$ 的个数求解。同样放到这题,扫描右端点 $R$,设 $f_i$ 表示 $[i,R]$ 区间的权值,其变化也可以用单调栈表示成 $\mathcal O(n)$ 次区间加。现在要求的是 $f$ 区间历史最值及个数。

使用线段树,设计标记时考虑历史最值累加和加标记的关系,发现不可能出现加标记两侧都是历史标记的情况,否则存在一个历史标记没有用。于是标记为 $(l,c,r)$,表示先加 $l$,再累加 $c$ 次历史最值,再加 $r$。信息就维护当前和历史最值及个数,合并推一推就出来了。总复杂度 $\mathcal O((n+q\log n))$。听说 CF 题解是分块?怪不得开这么小。

P9990 [Ynoi Easy Round 2023] TEST_90

跟上两题差不多推历史和标记就行,之后应该会写。

P3863 序列

题意

给定长为 $n$ 的序列,$q$ 次操作,区间加或查询某个位置在过去的多少秒内不小于 $y$。$n,q\le 10^5$。

题解

由于是区间修改和单点查询历史信息,考虑换维扫描线,扫序列维,维护当前每个时刻对应的值。于是问题转化为在长为 $q$ 的序列上后缀加,求前缀中不小于 $y$ 的个数。使用分块维护,每个块内对所有数排序,修改时给整块打标记,暴力重构散块,复杂度 $\mathcal O(\frac qB+B\log B)$;查询时整块内二分,散块内暴力查,复杂度 $\mathcal O(\frac {q\log B}B+B)$,取 $B=\sqrt q$ 可得最优复杂度 $\mathcal O(q\sqrt q\log q)$。

事实上排序时只有一个后缀加了值,可以分成两半进行归并,这样修改的复杂度就是 $\mathcal O(\frac qB+B)$ 了,平衡平衡可以把 $\log q$ 也放根号里,跑得快了一些。

P7560 [JOISC 2021] フードコート (Day1)

题意

有 $n$ 个队列,每个事件可能向编号在 $[l,r]$ 内的队尾加入 $k$ 个 $c$,或删掉队头的至多 $k$ 个元素直到删空,过程中询问当前某个队列中第 $t$ 个元素。$n,q\le 2.5\times 10^5,k\le 10^9,t\le 10^{15}$。

题解

由于每个队列是独立的,修改影响一个区间内的队列,且询问只在单个队列内,考虑换维扫描线,扫描序列维,数据结构维护操作维。这样每个修改只会加入和删除各一次,查询时只考虑操作维的一段前缀即可。

于是操作序列上有一些加入和删除操作,查询进行前缀操作后第 $t$ 个元素。在序列不会删空时是容易做的,只需要线段树二分出所有加入操作的第 $(t+s)$ 小位置即可。可能删空时考虑找到最后一次删空的时刻,从这个位置开始往后做。不难发现这个位置是该前缀内前缀和最小值,于是线段树维护区间和、区间负数的和以及前缀和最小值及位置即可解决,复杂度 $\mathcal O(q\log q)$。

P11536 [NOISG 2023 Finals] Curtains

题意

给出 $m$ 个区间 $[s,e]$,$q$ 次询问一个区间 $[l,r]$ 能否被表示为若干给定区间的交。$n,m,q\le 5\times 10^5$。

题解

选上所有 $l\le s\le e\le r$ 的区间 $[s,e]$ 一定不劣,判断这些区间能否完全覆盖 $[l,r]$ 即可。考虑扫描 $r$ 这一维,对每个点 $i$ 维护 $f_i$ 表示 $s\le i\le e\le r$ 的区间中 $s$ 的最大值。若 $[l,r]$ 内的 $f$ 值均不低于 $l$,则每个点都能被 $[l,r]$ 内的区间覆盖,否则一定不合法。于是进行区间取最大值,求区间最小值即可,这个可以线段树 $\mathcal O((n+q)\log n)$ 维护。

还有一些别的做法,大概是维护一些奇妙的可合并标记,感觉都没有这种做法好啊,也忘了当时咋做的了,不管了。

10.26 树上问题

  • 路径修改,查询树上邻居。考虑对每个点维护其所有轻儿子的信息,修改量可以控制到 $\mathcal O(\log n)$。

P5314 [Ynoi2011] ODT

题意

给定一棵树,需要支持路径加,求一个点及其邻居中第 $k$ 小点权。$n,m\le 10^6$。

题解

如上述,对每个点用数据结构维护其所有轻儿子的点权,路径修改会影响到 $\mathcal O(\log n)$ 条轻边对应点的数据结构。同时维护每个点的点权,查询时将其父亲和重儿子加入数据结构查询即可,查完再删去,即可做到 $\mathcal O(q\log ^2 n)$ 的复杂度。这个需要卡常,不写了。更低复杂度是极难的,不管了。

不行,太牛了,之后应该会写。

P8511 [Ynoi Easy Round 2021] TEST_68

题意

给定一棵树,点有点权,对每个点求其子树外两点点权异或和的最大值。$n\le 5\times 10^5,a_i\le 10^{18}$。

题解

性质题。考虑找到全局最大异或和 $a_x\oplus a_y$,则对于所有 $x,y$ 均在子树外的点 $u$ 均已确定答案,未确定的只有 $x,y$ 两点到根路径上的点。对于这两条路径,其上点子树外的范围从根到底逐渐扩大,可以从根到底依次加入数并实时维护最大异或和。扔到 Trie 树上求一下就好了,时空复杂度 $\mathcal O(n\log V)$。

  • 树上两条不相交路径,可以枚举点然后分到子树内外。

P6072 『MdOI R1』Path

题意

给定一棵树,边有边权,选择两条点不相交的路径使得路径边权异或和之和最大。$n\le 3\times 10^4,w\le 10^9$。

题解

如上,考虑枚举分界点分到子树内外,之后需要分别求子树内外最大路径异或和。首先路径异或和可以用 $d_x\oplus d_y$ 来表示,其中 $d_i$ 为点到根的路径异或和。于是子树外的信息即上题所求,可以 $\mathcal O(n\log V)$ 解决;子树内比较暴力的方式是启发式合并,可以做到 $\mathcal O(n\log n\log V)$。

考虑进一步优化,再次考虑上题中 $d_x\oplus d_y$ 最大的点对 $(x,y)$,注意到两条路径外所有点的 $f_u$ 均相同,此时这些点中存在互相包含关系,于是只有极大的子树可能贡献到答案。显然这些子树两两不交,可以直接暴力 $\mathcal O(n\log V)$ 解决。至于路径上的点,从底到根子树依次扩大,按此顺序依次加入即可,总时间复杂度也是 $\mathcal O(n\log V)$ 的。

CF1344E Train Tracks

可以根据树上启发式合并证明限制区间总共只有 $\mathcal O(m\log n)$ 个,通过启发式合并等找出这些区间后贪心即可。之后应该会写。

  • 求一个点最终走到哪个点,可以尝试判断 $(x,y)$ 是否可达,之后通过树剖 / 二分之类的方式求出终点。

未公开题目

题意

给定一棵二叉树,每个点上有形如 $y\le a$ 或 $y\ge a$ 的限制,$y$ 值若满足限制则走到左子树,否则走到右子树。要求支持单点修改,查询 $y$ 值从 $x$ 点开始走会停到哪个叶子。

题解

先树剖,之后对于每条重链,用线段树维护 $y$ 要走完某个区间需满足的上下界。走的时候二分一下在当前重链能走到哪,之后跳出去即可,复杂度 $\mathcal O(q\log ^2 n)$。没题写不了。

神秘来源题目

题意

给定一棵树,每条边有一个字符,询问给出起点 $x$ 和字符串 $S$,每次走向邻边中在 $S$ 中最靠前的边并将该边删除,求最终停的点。$n,q\le 3\times 10^5,\sum=26$。

题解

与上题相同,然而这里走一条路径的要求变成若干 $i$ 在 $j$ 前的限制或起来,共 $\sum^2$ 个。这是 01 信息,直接压位存储。然后先向上跳到跳不动,之后再沿着重链跳,跳出重链时可以暴力求下一条重链,复杂度 $\mathcal O(q\log ^2n \frac {\sum^2}{w})$。lxl 说如果度数太大需要用数据结构维护轻边,不过这题不用。没题写不了。

P8990 [北大集训 2021] 小明的树

把合法转化为灭的灯为连通块,之后点边容斥,扫描线维护。之后应该会写。

10.27 杂题

P6466 分散层叠算法(Fractional Cascading)

题意

给出 $k$ 个长为 $n$ 的有序数组,$q$ 次查询 $x$ 在每个数组中的非严格后继。强制在线,$k\le 100,n\le 10^4,q\le 5\times 10^5$。

题解

显然有 $\mathcal O(qk\log n)$ 的暴力,即对每个数组分别二分。尝试通过某种方式在第一次二分时处理部分后面的信息。先考虑两个序列的情况,将第二个序列偶数位置的元素插入第一个序列,这样在第一个序列中二分出结果后,第二个序列的答案只会在长为 $2$ 的区间内,可以 $\mathcal O(1)$ 求出。

拓展到 $k$ 个序列的情况,从后往前依次处理,每次将当前序列偶数位置的值插入上一个,使用归并排序即可。这样倒数第二个序列有 $1.5n$ 个元素,之后是 $1.75n,1.875n$ 等等,可以发现永远不会超过 $2n$。同时预处理出每个序列每个位置及之后第一个当前 / 之后序列元素,这样只需要在第一个序列中二分,后面全都可以 $\mathcal O(1)$ 微调出来,于是可以做到 $\mathcal O((n+q)k+q\log n)$ 的复杂度。

P11721 [清华集训 2014] 玄学

可离线时建线段树并在对应节点上分别二分,在线动态构建线段树可以 2log,再加上分散层叠可以 1log。之后应该会写。

10.28 做题?

问题

  • 组合统计问题:计数 / 最优化 / 判定 / 构造。

关心组合结构:整体结构 / 个别判定。

组合研究工具:调整 / 差分生成 / 整体刻画观察。

    • 数据结构。
    • 交互。
    • 并行?流?强强??!!??
  • (精确)(符号)计算问题。

  • 数值计算问题。

研究方法

  • 理论推导。
  • 实验。

特例、特殊性质 / 画图、打表、渐进估计、验证。

可能性质 / 信息压缩、化简 / 刻画形式。

问题分类

  • DP。
  • DS。
  • 子问题(分治、倍增)+ 微调。
  • 优化 - 构造。
  • 随机 - 近似。

UOJ792【UR #24】比特跳舞

讲“做题?”的例题,考虑刻画奇数个本质不同子序列的限制,发现可以从开头起每次跳到下一个相同位置,看是否能跳完即可。然后再注意一下或打表可以发现树上形成了若干个组,每个组内两两合法。于是用每对极小合法对合成大的组即可。之后应该会写。

共 137 篇博客