省选集训 day 2 平衡树

link

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{1}{a_k+\frac{1}{a_{k+1}}}=\frac{a_{k+1}}{a_ka_{k+1}+1} \]

因此会有假设后面若干步得到答案是 \(\frac{x}{y}\),那么有:

\[\frac{x'}{y'}=\frac{1}{a_k+\frac{x}{y}}=\frac{y}{y·a_k+x} \]

可以写作矩阵:

\[\begin{bmatrix} 0&1\\ 1&a_k\\ \end{bmatrix} \times \begin{bmatrix} x\\ y \end{bmatrix} \]

因此答案可以表达为关于序列 \(a\) 相关的矩阵乘积,注意是倒着由 \(k\) 乘到 \(0\) 的,并且最开始 \(x=0,y=1\)

考虑操作 W,其实显然有:

\[\begin{bmatrix} 0&1\\ 1&a_k \end{bmatrix} \times \begin{bmatrix} 1 &1\\ 0&1\\ \end{bmatrix} = \begin{bmatrix} 0&1\\ 1&a_k+1\\ \end{bmatrix} \]

注意这里我们需要右乘,其道理是如果将E也表示为这样的形式,那么就不需要考虑 \(a\) 的末尾具体是啥了

考虑操作 E

其后一种情况可以写为:

\[\begin{bmatrix} 0&1\\ 1&a_k \end{bmatrix} \times \begin{bmatrix} 1&-1\\ 0&1 \end{bmatrix} \times \begin{bmatrix} 0&1\\ 1&1 \end{bmatrix} \times \begin{bmatrix} 0&1\\ 1&1 \end{bmatrix} = \begin{bmatrix} 0&1\\ 1&a_k \end{bmatrix} \times \begin{bmatrix} 0&-1\\ 1&2 \end{bmatrix} \]

同时前一种情况可以描述为

\[\begin{bmatrix} 0&1\\ 1&a_{k-1}+1 \end{bmatrix} \times \begin{bmatrix} 0&1\\ 1&a_k \end{bmatrix} = \begin{bmatrix} 0&1\\ 1&a_{k-1} \end{bmatrix} \times \begin{bmatrix} 1&1\\ 0&1 \end{bmatrix} \times \begin{bmatrix} 0&1\\ 1&1 \end{bmatrix} = \begin{bmatrix} 0&1\\ 1&a_{k-1} \end{bmatrix} \times \begin{bmatrix} 1&2\\ 1&1 \end{bmatrix} \]

同时我们发现对于上面的那种情况,带入 \(a_k=1\),有:

\[\begin{bmatrix} 0&1\\ 1&1 \end{bmatrix} \times \begin{bmatrix} 0&-1\\ 1&2 \end{bmatrix} = \begin{bmatrix} 1&2\\ 1&1 \end{bmatrix} \]

得到了同样的结果

那么这告诉我们,其实有:

\[\begin{cases} W:\begin{bmatrix} 1&1\\ 0&1 \end{bmatrix}\\ E:\begin{bmatrix} 0&-1\\ 1&2 \end{bmatrix} \end{cases} \]

剩下的维护属于平衡树基础操作:维护正反的左右向的矩阵积一共四个即可。

posted @ 2024-12-24 17:15  spdarkle  阅读(57)  评论(0)    收藏  举报