省选集训 day 2 平衡树
A
注意到每条运动轨迹是已知的,我们的目标就是找到可以选择的最大权值(定义为路径上的特殊点个数)的运动轨迹并支持删除这些点。
找轨迹:利用斜率为 \(\pm 1\) 的直线 \(x+y,x-y\) 至少有一个不变的性质寻找
对于边界,可以使用常见手段:延拓一倍平面,也就是变成 \(2n\) 行,这样就只会走模运算意义下的直线
注意特殊点公用位置的情况。
同时我们由于从每个特殊点转折后有两个方向,不妨加一个第二维度 \(0/1\) 描述方向。
因此我们就可以表示出每条链及其方向了。
使用权值线段树维护每一行的开头的轨迹的最大值并记录编号。
然后直接删掉整条链,这部分由于方向确定,所以一个点至多在两条链里,因此总删除复杂度 \(O(M)\)。
然后主要的问题在于如何维护每条链的权值,支持动态删点,并且还有可能由于链头被挡住导致只能从链中间取的情况。
因此我们还需要考虑到每一行的归属轨迹。
暴力地,我们直接对涉及到的链只修改被更改的部分。考虑到其运行速度相当快,我们来思考下暴力做法的复杂度。
可以想到,如果一条链产生相当大的时间开销,那么必然是从后面每次都往前删,删很多次,并且这条链不是最长的链,这告诉我们单次取出一条贡献 \(w\) 的链,其复杂度上界是 \(O(\min(m,w^2))\),那么现在一个更强化的问题是:给定序列 \(a_1\sim a_n,\sum a_i=m\) 然后复杂度不超过 \(\sum \min(m,a_i^2)\)
考虑到在 \(n\) 固定时,\(a\) 贪心取 \(\sqrt m\) 及更低的值, 那么必然是越散越大,也就是 \(m·\sqrt m\) 的上界。
一种可能的情况是当前链挡住后面某一条很长很长的链,导致其被更新,我们考虑考察这条链的更新次数,其本质还是等差数列级(如果要挡住,每次的链长度不会相同),也就是根号级别。
如有其他hack方法欢迎提出。
B
考虑置换环,一次交换相当于分裂环/合并环。
那么对于这个操作,我们必然是希望不断分裂环让其变为全自环的。
然后怎么操作呢,例如这样一棵树 \(a:3 1 2,p:011\)
就无解了
这告诉我们这个环必然得是一个从根到底的一条链上的节点,但是不要求顺序,这也可以解释链的情况必然有解。
考虑如果没有顺序,一个自然的想法是让深度次大与深度最大互换,这样就分裂为两个置换环了。
但是有了按照顺序操作的限制,我们应该怎么办?
你要保证每个环仍然足够鲜活,也就是除了深度最大的点都还能操作
也就是需要有意识地隔离深度最大点
也就是操作一个点后让它变为深度最大点
建立环 \(i\to a_i\)
例如现在操作 \(x\),反着跳,直到遇到第一个 \(y\) 使得 \(dep_y>dep_x\),这时候交换这两个点的 \(a\) 值,就可以完成操作了。
也就是说,需要一个数据结构,维护环分裂,某个方向首次 \(>\) 的值,
注意到我们可以以最大 \(dep\) 作为序列终点维护整个序列,我们以反方向,也就是 \(a_i\to i\) 为正方向,那么相当于是若操作 \(x\),往右找到首个 \(t\) 满足 \(dep_x<dep_t\),然后将这个序列变为:
x 方向: \([x+1,t-1][x]\)
t 方向:\([1,x-1][t,end]\)
使用 fhq_treap 维护即可。
C
基础题目,线段树合并/启发式合并/可并堆板题。
D
可以发现可以单独维护分子分母,也就是有:
因此会有假设后面若干步得到答案是 \(\frac{x}{y}\),那么有:
可以写作矩阵:
因此答案可以表达为关于序列 \(a\) 相关的矩阵乘积,注意是倒着由 \(k\) 乘到 \(0\) 的,并且最开始 \(x=0,y=1\)。
考虑操作 W,其实显然有:
注意这里我们需要右乘,其道理是如果将E也表示为这样的形式,那么就不需要考虑 \(a\) 的末尾具体是啥了
考虑操作 E
其后一种情况可以写为:
同时前一种情况可以描述为
同时我们发现对于上面的那种情况,带入 \(a_k=1\),有:
得到了同样的结果
那么这告诉我们,其实有:
剩下的维护属于平衡树基础操作:维护正反的左右向的矩阵积一共四个即可。

浙公网安备 33010602011771号