260112C untitled

给定长为 \(n\) 的序列 \(a\)\(q\) 次询问每次 reverse 长为 x_i 的前缀。每次 reverse 后询问该前缀中有多少对 \(i<j\) 满足 \(a_i=a_j\)

\[n,q \le 2\times10^5 \]


在操作序列上根号重构。每 \(B\) 个操作重构,将序列分为至多 \(B\) 个段。

对颜色根号分治维护信息。

对于出现次数 \(\le C\) 的颜色,我们暴力找出至多 \(nC\) 对同色点对,维护每两段之间的 \(\mathcal O(B^2)\) 对贡献。处理操作答案时枚举前缀中的段对计算贡献。

对于出现次数 \(>C\) 的颜色,至多有 \(\frac nC\) 种,我们维护其在每块内的出现次数,查询时直接遍历计算。

那么如果我们暴力地维护翻转与求答案的操作,可以做到 \(\mathcal O(\frac nB(nC+B^3+nB/C))\),平衡得 \(O(n^{9/5})\)。很不幸过不去。

考虑进一步地,在操作序列上分治。先 \(\mathcal O(B\log B)\) 地预处理出每个分治区间内所有操作将序列分成的段在操作完这个区间后的排列顺序与翻转情况。

显然对于区间 \(R\) 的左/右区间 \(S\) 的操作的端点集合是 \(R\) 的端点集合的子集。因此每个 \(S\) 中的块都能恰好由若干个 \(R\) 中的块拼成。将父节点的信息中的若干段合并即可得到子节点的信息。我们只需要在根节点预处理一次信息即可在分治过程中得到每个叶子节点的信息。

分治过程中需要维护段的最终位置和翻转情况以及两两块之间的贡献与每块中 \(>C\) 颜色的数量。

\(T(k)=2T(\frac k2)+O(k^2+k\frac nC)=\mathcal O(B^2+\frac nCB\log B)\)

此时总时间复杂度为 \(\mathcal O(\frac nB(nC+B^2+\frac nCB\log B))\),在 \(B=n^{2/3}\log^{1/3}n\)\(C=n^{1/3}\log^{2/3}n\) 处平衡得 \(\mathcal O(n^{5/3}\log^{1/3}n)\)

有个小优化是可以压位维护 \(>C\) 颜色的数量,可以再乘 \(\frac {\log n}\omega\)

值得注意的是这里的分治形式特殊,信息由父亲通过“合并”得到子节点的信息,最后在子节点得到答案。也被称为 tb5 分治。

posted @ 2026-01-13 16:22  CuteNess  阅读(10)  评论(0)    收藏  举报