穿过阵列
CF1588F Jumping Through the Array
给定长度为(n)的序列(a)和排列(p ),可以实现下列操作:
给出\(l,r\)。seek \(\ sum \ limits _ { I=l } { r } a _ I \);
给出\(x,y\)。让我们将\(I \u to p _ I \u)连接成置换环,并将\(y \u)加到环上\(x \u)所在的每个点的权重上。
给出\(x,y\)。Exchange \(p_x,p_y\)。
\ 1 \ le n \ le 2 \ cdot 10^5,-10^8\le a _ I \ le 10^8,1\le p _ I \ le n,1\le q\le 2\cdot 10^5\)。
时间限制\(\text{8000ms}\),空间限制\(\text{512MB}\)。
Solution
按照时间根考虑分治,我们将一起处理\(B\)个连续操作。
我们把\(2\)操作的操作点(即\(x\)和\(3\)操作的操作点(x,y\)染成黑色,只操作这些黑点。
在操作之前考虑每个置换环,如下所示:
我们把它分成几个“链”(红色区域),可以发现每个链在操作中都是作为一个整体出现的,也就是,\(\Delta\)相等:
只有\(2B\)个链,所以我们只需要为每个链维护\(\Delta\)。
对于\(1\)操作,区间\([l,r]\)的点权重之和为\(\sum\limits_{ I=l} {r} \)加上\(\sum\limits_{每个链} \ delta \。
对于\(2\)操作,它必须将\(y\)和复杂性\ (o (b) \)添加到当前\(x\)所在的链和该链所在的环的其他链中。
对于\(3\)运算,我们交换两个黑点的链号,即\(O(1)\)。
在这一点上,我们可以以(o(\ frac { q } { b } \ CDOT(B2 \ log n))\)的复杂性来解决这个问题。
取\(B=\sqrt{n/\log n}\),时间复杂度\(O(q\sqrt{n\log n})\)。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/92786.html