UOJ Round #26 B. 街头庆典

UOJ Round #26 B. 街头庆典

简短的题目:

给定一棵 nn 个点的无根树,树上每条边都有相同的长度 DD

你可以割掉树上的若干条边,割掉第 ii 条边要付出 wiw_i 的代价。

把一些边割掉后,树变成了若干个连通块。你想使得每个连通块的直径长度之和加上割边付出的代价之和最小,输出这个最小值。

搬运题解。

https://zhoukangyang.blog.uoj.ac/blog/8846

有启发性的题。

由直径的性质可知,每个联通块包含了距离其直径的中心不超过某个定值的所有点。

分析最优解下,被割掉的边的端点一定是其所在联通块的直径端点,否则联通块直径长度会变大。

于是考虑在以某个点为根下,除了根节点所在联通块,其他联通块一定以其中深度最浅的点为直径端点。

于是我们考虑以直径的端点为根,这下每个联通块都满足以其中深度最浅的点为直径端点,现在直径是直上直下的了。

设计 dpfuf_u 表示 (u,fau)(u,fa_u) 的边被割掉时 uu 子树内最小代价,设 su,ds_{u,d} 表示 uu 子树内割掉所有与 uu 距离为 dd 的边的代价之和(注意是边深度小的端点与 uu 的距离,且割掉后剩下联通块的最小代价也得加上,即要与 ff 合并计算)。

直径的中心可能在边的中间,不好记录。

于是记 gu,ig_{u,i} 表示 uu 所在联通块的中心在 uu 子树内,且 uu 到联通块深度最浅点的距离为 ii,最小贡献,注意这里 uu 所在的联通块的点可以选取到子树外,因为后面要合并,这样做的好处是可以得知直径的长度和中心,所以 gu,0g_{u,0} 等价于 ff。且我们要在中心算直径的贡献。

考虑转移:

ss

  • su,i=vsv,i1s_{u,i}=\sum\limits_{v}s_{v,i-1},其中 i[1,n]i\in[1,n]
  • su,0=vfv+wu,vs_{u,0}=\sum\limits_{v}f_v+w_{u,v}

gg

  • 中心是 uugu,isu,i+2i×Dg_{u,i}\gets s_{u,i}+2i\times D,其中 i[0,n]i\in[0,n],意思是先使这是某一直径,再算贡献,这里距离 uuii 的祖先即使不存在也不影响,因为我们最终要求的答案是 grt,0g_{rt,0}
  • 中心在 uu 到儿子的边上:
    • gu,imin(su,isv,i1+sv,i+(2i+1)×D)g_{u,i}\gets \min(s_{u,i}-s_{v,i-1}+s_{v,i}+(2i+1)\times D),其中 i[1,n]i\in[1,n]
    • gu,0min(su,0fvwu,v+sv,0+D)g_{u,0}\gets \min(s_{u,0}-f_{v}-w_{u,v}+s_{v,0}+D),此时最浅点为 uu,但中心在 (u,v)(u,v) 中间,所以整个联通块只有 u,vu,v 两个点。
  • 中心在 uu 的儿子的子树内:
    • gu,imin(gv,i+1+su,isv,i1)g_{u,i}\gets \min(g_{v,i+1} + s_{u,i}-s_{v,i-1}),其中 i[1,n]i\in[1,n],因为我们要使这条路径为直径,所以得割掉会影响直径的边,就是子树内距离 uu 恰为某个定值的边。
    • gu,0min(gv,1+su,0wu,vfv)g_{u,0}\gets \min(g_{v,1}+s_{u,0}-w_{u,v}-f_{v})

反正就是神仙,现在是 O(n2)\mathcal O(n^2) 的了。

发现 ss 的计算可以长链剖分。

现在处理包括根的长链。

情况一:这条长链上的点所在的所有连通块的中心都在长链上。

这等价于每个连通块都存在直径完全在长链上,因为最优解形态下每个联通块的直径都是直上直下的,而中心在长链上,即直径的底端一定是最深的叶子,也在长链上。

形式地,设 vall,rval_{l,r} 表示长链上 [l,r][l,r] 的点构成了一条直径,大概就是 i=lrsi,min(il,ri)\sum\limits_{i=l}^{r}s_{i,\min(i-l,r-i)}^{'},其中 ss^{'} 表示去除长链影响的贡献。

flf_l 表示长链上第 ll 个点的原 ff 值,大概就是 minr=ltfr+vall,r\min\limits_{r=l}^{t}f_r+val_{l,r},其中 tt 是长链长度,也就是我们这里并不需要 gg

将长链从下往上处理,移动 ll,更新 fr+vall,rf_r+val_{l,r},考虑 vall,rval_{l,r} 的变化。

riilr-i \leq i-lil>mxii-l > \text{mx}_i 时,ii 就不会再发生变化了(mxi\text{mx}_i 表示 ii 下挂的短链长度)。

每个 ll 移动时,只会将 ll 挂的短链对应更新,而对后面的影响是一定的且是一段后缀的 rrvalval 值,根据长链剖分的性质,这部分修改是均摊 O(n)\mathcal O(n)

影响并不好快速维护,考虑线段树。

现在长剖维护 ss^{'},线段树优化计算 gg

现在这个假设下可以做到 O(nlogn)\mathcal O(n\log n)

情况二:长链上的点所在的连通块的中心可以在短子树内(或下挂短子树的边中)

(好像情况二是包含情况一的,不管了,下面有用

再考虑上 gg,发现由于要考虑直径,所以 gg 的第二维并不能超过子树最大深度,还是考虑长链剖分维护。

但是当中心在长链上时,综合转移需要数组对位取 min\text{min},而且位数是整个子树而非短子树的最大深度,所以此时长链剖分无法保证时间复杂度。

而我们只考虑联通块中心在短链的情况下,位数就是短子树的最大深度了,这下可以进行长链剖分。

于是,将情况一和情况二综合,就会考虑到所有转移,就能得到所有 ff 了,但是我们并不能得到 gg,原因显然。

但是,这种情况只处理了包括根的长链答案,其他链的情况没有算上。

根据第三种转移,发现合并只需要处理链顶的 gg 值。

我们发现 gu,ig_{u,i} 并不需要考虑 uu 之上的点的形态。

为了方便考虑,我们给将长链从上到下从 00 开始标号,并将每条长链从深到浅加上 tt 个虚点。

发现,g0,ig_{0,i} 的含义与 fif_{-i} 的含义是类似的。

可以发现,g0,ig_{0,i} 的值也就是直径下端点在长链编号 i\ge i 的点的情况加上中心在短链上的情况。

后者前面算过了,前者在扫描线时多考虑一下就行了。

于是我们可以求出所有的 g0,ig_{0,i}

这题就以 O(nlogn)\mathcal O(n\log n) 的复杂度完成了。

posted @ 2023-11-01 10:28  蒟蒻orz  阅读(15)  评论(0编辑  收藏  举报  来源