久未放晴的天空,依旧留着你的|

TulipeNoire

园龄:1年10个月粉丝:18关注:17

「NOI2024」登山

这是一个补题时自己胡出来的逆天大常数劣复杂度做法,洛谷上最慢点 1.92s。

显然每次冲刺到的点深度都是递减的,并且下一次冲刺的深度限制只与上一次冲刺到的点以及上一次到现在的休息点相关(这些点的 dh 限制以及出发点的 [l,r] 限制)。我们考虑令 fi 表示从 i 出发到 1 的方案数,那么枚举 i 子树中的一个节点 j ,那么我们将 fj 加上 fi×gi,j,其中 gi,j 表示 j 子树内有多少节点,其到 j 路径上的 dh 最小值大于 di,并且 di 在其能跳到的区间内。这样可以暴力做到 O(n2)

考虑优化,我们按照深度从小到大枚举,假如说当前枚举到了深度 t,我们对于每个 i 维护 gx,i,其中 xi 的深度为 t 的祖先。容易发现,我们会不断让一些点的 dht,这意味着这些节点不能够成为选中点到 j 路径上的点,我们称其为被涂黑。假如我们钦定一个出发点,那么从它出发的一段极长白色前缀祖先的 f 值会增加 fx。也即是 gx,i 表示 i 的子树中,i 所在白色连通块中满足 dx[djrj,djlj]j 数量(若 i 为黑色则是 0)。随着深度的推进,我们可能会进行一下两种操作:

  • 涂黑一个点 x:容易发现,令 find(x)x 的最浅祖先,使得其到 x 路径全白,则 xfind(x)g 减去 xg,再标记 x 为黑色。

  • 使一个点 x 满足/不满足区间限制:若 x 已经被涂黑,则跳过。否则将 xfind(x)g 全部加上/减去 1 即可。

然后再枚举这一层的所有点,从其出发有 k 的转移量,就是将子树内的 fi 值都加上 k×gx,i。这些操作都可以线段树维护,具体信息就是区间 Ai×Bi 以及区间 Bi,操作就是每次 A 或者 B 的区间加,用树链剖分加线段树即可做到 O(nlog2n) 的时间复杂度。细节很少,比较好写。但是其实是比较没用的乐子做法。

本文作者:TulipeNoire

本文链接:https://www.cnblogs.com/TulipeNoire/p/18684389/NOI2024_D2T2

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   TulipeNoire  阅读(12)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起