Loading

WC 2018 题解

A 通道

若干套路拼起来的胖题。

设这三棵树分别是 \(T_1,T_2,T_3\)。沿用“CTSC 2017 暴力写挂”的思路,对第一棵树点分治,此时要处理的是以 \(u\) 为中心的一块在 \(T_1\) 上的连通块。一个直接的思路是,直接将当前连通块内的所有点都放在第二棵树上建虚树,并将在 \(T_1\) 上处于 \(u\) 的不同儿子的子树内的点染不同的颜色。预处理每个点到 \(u\) 的距离 \(d_x\) 和颜色 \(c_x\),需要求出

\[\max_{c_x\neq c_y}\{d_x+\mathrm{dep'}_x+d_y+\mathrm{dep'}_y-2\mathrm{dep'}_{\operatorname{LCA'}(x,y)}+\operatorname{dist''}(x,y)\}. \]

令每个点的点权 \(w_x=d_x+\mathrm{dep'}_x\),在虚树上枚举 \(v=\operatorname{LCA'}(x,y)\),直接维护 \(v\) 子树内的两端点颜色不同的带权直径。但这里实际上有一些问题,如果有 \(>2\) 种颜色,那么这里的直径需要记录很多条。

考虑点分治过程中,每次取出大小最小的两个子连通块做上述过程,并将这两个连通块合并。通过这个,我们可以做到与边分治相同的功能。此时,虚树上只有两种颜色,直接记录这两种颜色各自的带权直径,计算答案也是容易的。

时间复杂度 \(O(n\log^2 n)\),或者 \(O(n\log n)\)

“合并”处的代码:

priority_queue<Block> que;
que.push({ 1,1 }), poi[len = 1] = u;
col[u] = u, val[u] = t2.dep[u];
for (auto [v, w] : t1.e[u]) if (!vis[v]) {
	int l = len + 1;
	GetDep(v, u, w, len);
	sort(poi + l, poi + len + 1, Comp);
	que.push({ l,len });
}
while (que.size() > 1) {
	auto p1 = que.top(); que.pop();
	auto p2 = que.top(); que.pop();
	int l = len + 1;
	len = merge(poi + p1.l, poi + p1.r + 1, poi + p2.l, poi + p2.r + 1, poi + len + 1, Comp) - poi - 1;
	For(i, p1.l, p1.r) col[poi[i]] = 1;
	For(i, p2.l, p2.r) col[poi[i]] = 2;
	VBuild(l, len), VDFS(1), Clear(1);
	que.push({ l,len });
}

B 州区规划

有一个显然的 \(O(3^n)\) 做法。其中的瓶颈在于“半在线子集卷积”:给定 \(\{a_i\}_{i=0}^{2^n-1},\{b_i\}_{i=0}^{2^n-1}\),求

\[f_S=a_S\sum_{T\subsetneq S} f_Tb_{S\backslash T}. \]

做法以后写。

C 即时战略

每次随机一个还未探索到的点 \(u\)。显然在任意时刻,已经探索过的点是一个包含点 \(1\) 的链,设其链头为 \(l\),链尾为 \(r\)。只需要花费多余的一次操作判断 \(u\) 接在链头还是链尾,然后将 \(l\leadsto u\)\(r\leadsto u\) 的路径上的点都探索一遍即可。

毛估估一下,需要的询问次数是 \(n+\log n+O(1)\) 的。

一般的树

考虑当前已经扩展过的连通块 \(S\)。每次找到一个没被探索过的点 \(u\),并在 \(S\) 中进行点分治,直到分治到未被探索过的点,这样就找到了 \(u\) 会接在哪个点上。

这样的时间复杂度是 \(O(n^2)\) 而询问次数是 \(n\log n\)。考虑动态地维护一个点分树,每次需要支持在某个点底下接上一个叶子。我们做类似替罪羊树重构的操作:设定阈值 \(\alpha=0.8\),当加入一个叶子 \(x\) 时,考虑 \(x\) 到根的路径,找到其中深度最浅的一个点 \(v\) 满足 \(\mathrm{size}_v>\alpha\times \mathrm{size}_{\mathrm{fa}_v}\),若存在这样的 \(v\),则对 \(v\) 的子树进行重构。

注意重构时整棵树的结构可能完全改变了,写的时候需要注意 \(\mathrm{size}_x\) 的更新。

时间复杂度 \(O(n\log^2 n)\),询问次数 \(O(n\log n)\)

posted @ 2023-01-09 14:25  Alan_Zhao_2007  阅读(31)  评论(0编辑  收藏  举报