
HMF-have much fun Site
文章
标签
16

阅

【题解】CF1039D You Are Given a Tree
热度: loading...
审核大大求过
考虑 ,设 为从 的子树里延伸到 的最长的链的长度。
对于每个节点,记下子节点里 值的最大值和次大值,如果这两个值合并后 大于等于我们需要的长度 ,就将其合并,并将 清零(因为记录的是一端为 的链的长度)可以证明这一定是最优的。
性感的证明:
发现如果在一个地方能够合并的一定会立刻合并,因此还保留在 里的一定是还不可以合并的,因此在第一个可以合并的点马上合并一定是最优的。
证明了和没证明一样
然后我们有两条路子:
- 根号分治
首先把 的直接 处理掉,发现之后 大于 的部分答案都小于 , 因此通过二分找出答案相同的一段区间直接赋值,复杂度为
- 整体二分
发现随着 的增大答案减小,因此对于一个询问区间,先求出区间中点 的答案 ,然后左半边的答案范围就在 ,右半边的答案范围就在 ,当答案范围缩小到一个数后直接赋值即可。
但这玩意的复杂度好像是假的(我证不出来,如果有大佬证出来可以评论一下打脸我),因此复杂度正确的做法还是和前一种一样,先暴力算出 的答案,然后在 到 的部分整体二分,因为答案只有 个,分治树只有 层,所以复杂度还是 。 本质相同
大概就是这么多,算是很典的题了。
赏
