2.1 不会有人数据结构比我还菜吧?

记录三道自己菜死了的与根号有关的题。其中每道题都有 polylog 解法。

题目名称太长了,就不放了。

CF1017G The Tree

根号做法:考虑操作分块,然后建虚树。建出虚树之后我们就发现很好处理了。同样的,处理每一个块结束后的真实形态,也可以借助这个虚树。总的来说,需要暴力维护一下每个虚树点上的真实颜色,每条边上的黑白点数,以及对非虚树点的清空&染色的 tag。

但是这题也有 polylog 做法。

双 log 做法:先不考虑2操作,每次一操作给该点加一,那么一个点是黑色当且仅当存在一个后缀使得其 sum 等于长度。一个常见的 trick:全体初始都减一,就转化为最大后缀 >=0 了。然后考虑2操作:我们实际上只需要清空子树,然后再更改一下 \(u\) 的权值,让根到 \(u\) 的最大后缀恰好为 \(-1\)。这个是容易的,查一下最大后缀然后单点修改即可。

LG8264 TEST_100

首先考虑分块,然后处理出每一个值在经过这个块后会变成什么。考虑像第二分块一样,用并查集维护值的变换。我们从左往右处理,每次都是将 \(>t\) 的减 \(t\)\(\le t\) 的取反然后 \(+t\)。然后考虑我们每次希望有一个势能的均摊。令最小值为 \(A\),最大值为 \(B\),如果全部在一边那么直接打 tag,否则我们每次都能将值域减少 \(\min(B-t,t-A)\)。实际上我们也确实能做到这样的均摊,假如 \(B-t<t-A\) 那么我们就将 \(t,\dots,B\)\(t,\dots,2t-B\) 合并,否则同理,然后再打全局 tag。就好了。

集训队互测2018 完美的队列

首先这题就是要求出每一个操作在什么时候带来的影响完全消失。

考虑一种很厉害的做法:考虑将一次操作 \((l,r,x)\) 拆成线段树上的 \(O(\log n)\) 个整区间。然后我们就只需要对每个线段树整区间上的一些操作求解。

然后考虑会对一个整区间上的产生影响的,要么来源于祖先节点的操作,要么来源于子树节点的操作,要么来源于自身。注意到后两者的总和加起来是 \(O(n\log n)\) 的!于是我们将后两者的时间拉出来,祖先节点的操作带来的影响,我们只需要知道在相邻两个时间之间祖先节点的操作次数,于是 BIT 维护关于时间的操作次数即可。然后我们对这些时间做双指针,并用另一棵维护下标的线段树,维护每个节点的 \(a'_i\) 即可。所以总复杂度 \(O(n\log ^2 n)\)

posted @ 2024-02-05 23:07  LarsWerner  阅读(9)  评论(0编辑  收藏  举报