1. 程式人生 > 其它 >CF1588F Jumping Through the Array

CF1588F Jumping Through the Array

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}\)

,空間限制 \(\text{512MB}\)

Solution

考慮按照時間根號分治,我們將連續 \(B\) 個操作一起處理。

我們將操作到的點(即 \(2\) 操作的 \(x\)\(3\) 操作的 \(x,y\))染黑,只有這些黑點是進行操作的。

考慮操作前的每個置換環,它形如這樣:

我們將其劃分成若干條“鏈”(紅色區域),可以發現操作中每條鏈都是以整體出現的,即 \(\Delta\) 相等:

而鏈只有 \(2B\) 個,因此我們只需要對每個鏈維護 \(\Delta\) 即可。

對於 \(1\) 操作,區間 \([l,r]\) 的點權和即為操作前的 \(\sum\limits_{i=l}^{r}\)

加上 \(\sum\limits_{每條鏈}\Delta \times 環內編號在[l,r]的點數\),複雜度 \(O(B\log n)\)

對於 \(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})\)