2026 NOIP %你赛 2 树剖 RE 寄

\(\gdef\red{\colorbox{FE4C61}{\color{#fff}\text{Red}}}\) \(\gdef\orange{\colorbox{F39C11}{\color{#fff}\text{Orange}}}\) \(\gdef\yellow{\colorbox{FFC116}{\color{#000}\text{Yellow}}}\) \(\gdef\green{\colorbox{52C41A}{\color{#fff}\text{Green}}}\) \(\gdef\cyan{\colorbox{13C2C2}{\color{#fff}\text{Cyan}}}\) \(\gdef\blue{\colorbox{3498DB}{\color{#fff}\text{Blue}}}\) \(\gdef\purple{\colorbox{9D3DCF}{\color{#fff}\text{Purple}}}\) \(\gdef\black{\colorbox{0E1D69}{\color{#fff}\text{Black}}}\) \(\gdef\gray{\colorbox{BFBFBF}{\color{#000}\text{Unknown}}}\)贺义河邑卫,河邑卫吓,以为阖已危。贺义河邑何毅:“为何矣?围合已围,何以卫河邑为?何毅!为何一味荷蚁微?”何毅慰阖邑谓:“贺义威诃,以为河邑畏。何矣?伪吓以为嚇疑危。贺义,伪貉矣!”谓:“盍亦威吓一围合,以畏贺义猥!”阖邑慰。何毅谓:“合宜威吓矣!”卫嚇以为吓意。围合已畏,贺义为吓,亦萎,贺医贺义,为贺医、尉。何毅慰:“贺义萎,合已畏,阖翼,威呵!一慰!”

赛时历程

开赛看 T1,一眼二分,接下来就不会了,滚去做 T2 了。T2 导导导,导出了依托这样的柿子:

\(f_{i,j}\) 为在 \(i\) 个点内炸出最大连通块大小为 \(j\) 的方案数,则

\[f_{i,j}=\sum_{g=1}^{i-j}\binom{i}{j}\times\text{不把这个连通块炸断的方案数}\times f_{i-j,g}. \]

可以看到导了跟没导似的,并且赛时考虑需要用到容斥,果断跳题。发现 T3 有点像那个月下“毛景树”,直接做,大样例 RE 了,破防,转而以为是大样例锅了,疯狂补充暴力,发现忘了 LCA 的 \(O(n\log_2n)\) 求法,痛失 \(10\) 分。(另外 T2 有 \(10\) 分的部分分要求“不把这个连通块炸断的方案数”,不会,痛失 \(10\) 分。)T5 根本没看。

编号 赛时估分 赛后出分
A \(30\) \(30\)
B \(10\) \(10\)
C \(100\) \(0\)
D \(50\) \(40\)
E \(0\) \(0\)

赛后改题 & 总结

B. 轰炸(bomb)

题目大意

敌方有 \(n\) 座城市(两两不同),每两个城市间都有一条双向交通线直连。问有多少个炸毁这些交通线的方案,使得最大的连通块大小为 \(k\)\(1\le n,k\le 2\times 10^3\)

思路

事实上,“不把这个连通块炸断的方案数”要用 \(O(n^2)\) 求出来。求法:设 \(g_i\) 表示在 \(i\) 个城市的连通块内炸交通线,不把这个连通块炸断的方案数。容斥一下,考虑炸断是 \(2^{n(n-1)/2}\) 个炸法,减去的是必须炸断的:选一个大小为 \(j\) 的连通块(钦定包含没被选中的最小的城市),共 \(\binom{i-1}{j-1}\) 个选法,在这 \(j\) 个城市里面保持连通,即 \(g_j\),剩余 \(i-j\) 个城市的交通线随便炸,\(2^{(i-j)(i-j-1)/2}\),也就是:

\[g_i=2^{n(n-1)/2}-\sum_{j=1}^{i-1}\binom{i-1}{j-1}\cdot g_j\cdot 2^{(i-j)(i-j-1)/2}, \]

好了我们算好了 \(g\)。接下来我们用这个东西算最大连通块为 \(k\) 的方案数,注意到这不好算,可以转换成算最大连通块至多为 \(t\) 的方案数,再令 \(t=k\)\(t=k-1\) 减一下即可。设 \(f_i\) 表示 \(i\) 个城市里面炸交通线,使得最大连通块大小不超过 \(t\) 的方案数,显然有

\[f_i=\sum_{j=1}^{\min(i,t)}\binom{i-1}{j-1}\cdot g_j\cdot f_{i-j}, \]

那么当 \(t=k\) 时的 \(f_n\) 减去 \(t=k-1\) 时的 \(f_n\) 就是答案。时间复杂度 \(O(n^2)\)

C. 忧虑(worry)

题目大意

\(n\) 座城市,\(n-1\) 条边权为 \(0\) 的道路将其连接成一棵树,再在其中建 \(m\) 条边权大于 \(0\) 的铁路。问将任意一条边权为 \(0\) 的道路炸毁后,原路段两端城市之间通过道路、铁路互相抵达的最短路径长度,无路径输出 \(-1\)。询问间互相独立,所有的道路、铁路均为连接两个城市的双向交通线,\(1\le n,m\le 10^5\)

思路

猜你想搜:洛谷 P4315 月下“毛景树”,注意到把线段树的区间加、覆盖改为区间 \(\min\) 即可。为什么?注意到一条边被毁会产出 \(2\) 个连通块,只需要有一条铁路连接这两部分即可,而我们只需在这一坨铁路中选边权最小的即可。注意到铁路两端的城市间任意一条道路断了,这条铁路都可以顶上去,因此我们可以给这些边打上铁路长度的权,每条道路最小那个权即是答案。显然树剖+线段树维护,又因为维护的是边不是点,我们要把边权移到下面的点上维护,具体的:

void update(int u, int v, long long w) {
	while (top[u] != top[v]) {
		if (d[top[u]] < d[top[v]]) swap(u,v);
		upd(1,I[top[u]],I[u],w);
		u = vat[top[u]];
	}
	if (d[u] > d[v]) swap(u,v);
	upd(1,I[u]+1,I[v],w);
	// 这里,u 要承接与他父亲相连的道路的权,所以这里不能给他更新上。
}

这样的时间是 \(O(n\log_2^2 n)\) 的。赛时这种线段树打挂了(我真厉害)并且忘记判断 \(-1\) 了。见祖宗 \(+2\)

posted @ 2026-07-07 12:56  Sternenlicht12345  阅读(18)  评论(0)    收藏  举报