一些$LCT$的瓜皮题目

一些瓜皮

放几个比较优(she)秀(pi)(LCT)题。
老惯例,每一题代码因为一些未知原因消失了(如果要的话私我好了,虽然会咕咕咕)。
嘴巴(AC)真香!

[SP16580] QTREE7

对黑色、白色各开一棵有根(LCT)
(x)点加入颜色(c)集合,则在(c)的那颗(LCT)上连接((x,fa_x)),在另一棵上断掉父亲边。
查询时,首先判断根结点是否在当前颜色集合内。
如果在的话直接查整棵(LCT)
否则走向右儿子,查询对应子树。
什么子树最大值啥的维护一下子树信息,拿(multiset)搞搞就行了。

[BZOJ2959] 长跑

动态联通图?这种东西估计只有鸽子他们才会吧......
注意到边是任意定向,所以一个环等价于都能走,直接缩起来即可。
所以如果当前连边两点已经在一个联通块了,那么直接暴力缩点。

[LOJ6041] 事情的相似度

(SAM),那么两个结点的(LCA)就是它们的最大(lcp)
离线,依次加入左端点,那么它沿着(SAM)(fail)树一路往上爬,遇到的所有右端点都有贡献。
这是(LCT)的经典应用,就是一个(Access)
并且显然只有最靠左的右端点有用,所以(LCT)维护最小右端点即可。
最后得到了若干二元组,扫描线一遍完事。

[ZJOI2018] 历史

显然每个结点的答案只与/子树内战争个数(sum)/和//最大战争个数的子树/的战争个数(mx)//有关。
(mx > lceil frac{sum}{2} ceil)时,(Ans = 2(sum-mx)),否则(Ans = sum-1)
一个直观想法就出来了,直接有根(LCT)维护子树最大值,每次(Access)更新答案。
吉老师:(naive)
问题在于:每次(PushUp)需要知道子树大小,而知道子树大小需要(Splay)当前结点。
所以这题就变仙了。
直接类似(LCT)维护状态,对于满足(mx> lceil frac{sum}{2} ceil)的儿子用重链连接,否则用轻链连接。
可以发现一条重要性质:爆跳父亲,重链个数不会超过(log_2(deep))
然后真相大白,全部暴力维护即可。

[BZOJ2888] 资源运输

维护重心是一个老的不行的套路了,使用启发式合并可以秒杀。
问题在于维护所有点到重心的距离和。
点分治?做梦吧你!
可以发现,对每一个点维护联通块内的点到其的距离和相当浪费。
其实我们只需要知道重心的该信息。
所以就只在重心维护这个信息,考虑重心移动时的转移,发现只需要再维护子树和就行了。
由于我们需要支持(Link)操作的同时维护子树信息,所以依旧需要维护换根反转标记。

[BZOJ3779] 重组病毒

显然染色操作就相当于(Access),然后考虑贡献。
我们把减少量差分处理,那么对于重链链顶的子树,答案全部减少了(1)
同时对于原来的重链儿子,其颜色会相对来说增加(1)
把原树给剖一下然后线段树区间修改直接维护即可。
现在有了换根操作,其实是一样的。
可以发现,换根后进行一次染色,等价于先染色然后换根(反正那条链的颜色只有一个)。
所以就当作什么都没发生,直接换根。
由于现在根可以在查询点的子树内,所以这种情况加贡献也要特殊处理,稍微弄一下就行了。

[BZOJ4573] 大森林

(n)(LCT)是不可能的,这辈子都不可能的。
由于询问保证查询点一定在树上,所以把那些多余的点全部建出来是没有影响的。
所以唯一难办的操作就是更换生长结点了,此时需要集体换父亲操作。
不难想到,对于第(i)个生长结点,建立一个虚拟结点(p_i),把长在它下面的结点全部连在(p_i)上。
现在可以解决集体换父亲了,但如何放置这些虚拟结点使其满足对应包含关系?
我们使用一种近乎疯狂的方式解决这个问题。
离线。
在算法开始前,我们把(p_i)连接到(p_{i-1})下面。
那么当碰到更换生长结点操作(i)的左端点时,直接把(p_i)连接到对应位置。
在该操作结束后,把(p_i)重新连接回(p_{i-1})下面。
包含关系显然时刻都是对的。
然后查询答案涉及求(LCA)(可能为虚点),很棒的是(LCT)完美兹瓷该操作。

原文地址:https://www.cnblogs.com/GuessYCB/p/10199976.html