CF1588F Jumping Through the Array
阿新 • • 發佈:2021-11-17
CF1588F Jumping Through the Array
給定一個長為 \(n\) 的序列 \(a\) 以及排列 \(p\),實現以下操作:
- 給定 \(l,r\)。求 \(\sum\limits_{i=l}^{r} a_i\);
- 給定 \(x,y\)。我們將 \(i\to p_i\) 連成一個個置換環,將 \(x\) 所在環上的每個點點權加 \(y\);
- 給定 \(x,y\)。交換 \(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}\)
Solution
考慮按照時間根號分治,我們將連續 \(B\) 個操作一起處理。
我們將操作到的點(即 \(2\) 操作的 \(x\) 和 \(3\) 操作的 \(x,y\))染黑,只有這些黑點是進行操作的。
考慮操作前的每個置換環,它形如這樣:
我們將其劃分成若干條“鏈”(紅色區域),可以發現操作中每條鏈都是以整體出現的,即 \(\Delta\) 相等:
而鏈只有 \(2B\) 個,因此我們只需要對每個鏈維護 \(\Delta\) 即可。
對於 \(1\) 操作,區間 \([l,r]\) 的點權和即為操作前的 \(\sum\limits_{i=l}^{r}\)
對於 \(2\) 操作,它必然是給當前 \(x\) 所在的鏈,以及這條鏈所在的環的其他鏈,增加 \(y\),複雜度 \(O(B)\);
對於 \(3\) 操作,我們交換兩個黑點連到的鏈編號,是 \(O(1)\) 的。
至此,我們可以在 \(O(\frac{q}{B}\cdot (B^2\log n+n))\) 複雜度解決。
取 \(B=\sqrt{n/\log n}\),時間複雜度 \(O(q\sqrt{n\log n})\)。