树剖进阶

找到了挺好的树剖 题单,写一写简单思路,换脑子。

P9808 [POI 2022 ~2023R1] zbo

我是唐比,想了转成前缀距离然后线段树上算前后俩数贡献差的唐氏做法,然后发现不用前缀距离和直接区间加倍数就做完了。

简单题,感觉跟 LCA 那题很像,显然你可以计算答案时每次加点进去,然后每次加点前查一下贡献,距离式子 \(pre_u + pre_v - pre_{lca}\),其中 \(pre_u + pre_v\) 显然很好计算,考虑 \(lca\) 的问题,其实就转成了 LCA 那题,我们考虑每次对一个点到根的所有路径长度倍数 \(+1\),然后每次查点的时候前缀 ask 就好了,当然,如果你转成了前缀距离和就可以得到我的唐比做法。

十五分钟写掉,算上这题和 CF 没交上的好像就 100 紫了。

code

P5478 [BJOI2015] 骑士的旅行

这有紫?注意到 \(k \leq 20\),线段树上每次 pushup 暴力合并即可。

注意一下合并时的大小问题,归并的合并方法是最快的,复杂度 \(O(nk \log n)\)vector 也能跑过。

code

P4312 [COI 2009] OTOCI

板题,发现不是强制在线,离线建树树状数组维护就好了。

code

P2542 [AHOI2005] 航线规划

LCT 是可以做的,但是考虑平凡树剖做法。

正难则反,因为保证了最后剩下的图一定联通,我们就可以删完边随便搞一棵生成树,此时树上每一条边都是关键边,令边权为 \(1\),树剖转到点上,然后每次往里面加边都一定会使得一个路径上的所有边全部不为关键边,区间推平为 \(0\),然后每次答案就是路径权值和。

code

P5305 [GXOI/GZOI2019] 旧词

豪题,P4211 的进阶版,转成离线加点是自然的。

类似那题的思路,把答案均摊到每一个点上,但是这题有 \(k\) 次方限制,我们考虑如何构造均摊,其实就是这里不好想,因为每一次要加的是 \(dep_{lca}^k\),不妨先把每个点的权变为 \(k\) 次方,假如此时我们继续求到根路径和,那得到的答案便是 \(\sum_{i=1}^{dep_{lca}} i^k\)。哎,那我们不妨直接在每一个点消一个贡献,每次每个点把他的父亲贡献删掉,也就是点权变为 \(dep_i^k - (dep_i-1)^k\),这样到根正好就把 \(\sum_{i=1}^{dep_{lca}-1} i^k\) 全消掉了,这种构造方式还是很巧的,这样就直接到根路径加路径查就好了。

10min 写掉,一发过。

code

P9555 「CROI · R1」浣熊的阴阳鱼

唐题,但是 trick 还是可以的。

考虑到一个区间的子状态非常少,不妨直接枚举答案,区间合并就不困难了,注意合并答案时需要同时维护答案和当前剩余的鱼的情况是什么,对于单点可以直接暴力枚举。

链上合并时的顺序问题很重要,画出图来仔细分析,对于其他的链上特殊合并问题也要注意。

code

P5559 失昼城的守星使

推式子好题,差不多做出来了,还是看了题解,太菜了。。。。

我们令 \(lca = LCA(x,y)\)\(P\) 为黑点集合,\(u\)\(i\) 点到链上路径的第一个交点。

那么有式子 \(\sum_{i \in P} dis(i,lca) - dis(u,lca)\),对于第一部分,\(\sum_{i\in P} pre_i + pre_lca - 2\times pre_{LCA(i,lca)}\),对于第二部分,我们还是按照区间覆盖,边权均摊来计算答案,第一部分的 \(pre_i\)\(pre_lca\) 显然是好计算的,对于 \(pre_{LCA(i,lca)}\),我们仍然考虑边权均摊,对于每一个黑点,将其到根的所有边 \(+1\),对 \(lca\) 询问即可,还是很套路的。

code

P6157 有趣的游戏

简单题,显然取模运算取一个最大值和一个严格最次大值就好了,这个线段树上很好维护,对于 \(B\) 的答案,就是全局去掉这两个点之后再求最大值和严格次大就好了,这个可以用 mutiset 维护。

code

posted @ 2025-02-21 23:10  Wei_Han  阅读(16)  评论(0)    收藏  举报