Processing math: 100%
4
18
2016
0

[bzoj]3637: Query on a tree VI

传送门-->http://www.lydsy.com/JudgeOnline/problem.php?id=3637

我居然作死点了这道题

显然可以lct硬上,但是突然就不想写lct,没办法用树剖将就一下


显然可以只存子树的答案,询问的时候只要找到最高那个点就行了,记黑点为1,白点为0,因为要是连续的,所以连续一段1一定是这些点的个数,0的话一定是0,于是这个东西是单调的,树剖之后往上爬,不能爬了就在这条重链里二分即可,发现是单点修改和区间查询,用一个树状数组就好了

然后就是要维护答案,我想不出直接维护的方法,把一棵树分成两棵,一棵专门搞黑的,另一棵白的,修改的时候,设修改的点为x,则要修改的链是x的父亲到这个同色块最上面的点u的父亲,为什么还要修改u的父亲?因为之后当u变色时就能方便的继承从儿子传来的贡献了,所以一次操作同时修改两棵树

感觉很优美,发现只有区间修改和单点询问,于是就再用两个树状数组,一共3

刚开始狂T不止,还以为树状数组都被卡常了,网上有题解是每条重链一棵线段树,好神呀,不过还好数据没有第二天才到,只是有细节写错导致死循环了,有兴趣的同学可以每条重链一个树状数组刷rank2333,应该比线段树快到不知道哪里去了

复杂度:O(nlog2n)

 

loading...

Category: bzoj | Tags: 树状数组 线段树 LCT 树剖 | Read Count: 3988

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com