Replace

liyixin發表於2024-10-16

Replace

cplusoj 連結

題意

給你一個長度為 \(n\) 的序列 \(A\),有 \(q\) 次詢問,每次詢問對於一個區間 \([l,r]\) 需要操作多少次才能變成區間 \([1,n]\),無解輸出 \(-1\)。其中一次操作指原區間變成 \([l'=\min_{i=l}^r\{a_i\},r'=\max_{i=l}^r\{a_i\}]\)

solution

看了feecle大佬的題解後對其中的結論有也許是另一種理解方式。

首先題目的操作與取 \(\min,\max\) 有關,因此透過豐富的經驗和敏銳的觀察力顯然我沒有可以發現:

\[f(l,r)=\cup_{i=l}^{r-1} f(i,i+1) \]

證明(或者應該叫理解方式):對於每個 \(i\),設 \(a_x=\min(a_i,a_{i+1}),a_y=\max(a_i,a_{i+1})\)\(f(i,i+1)\) 對應區間 \([a_x,a_y]\),其中相鄰的 \(i\) 對應區間至少有一個端點重合。因此所有的 \(f(i,i+1)\) 併成連續的一段區間,其中最左的一個端點和最右的一個端點就是 \(f(l,r)\) 的兩端。可見等式是成立的。

蒟蒻的我不能直接觀察出推論,但是也許可以這麼想:我們考慮對所有 \(f(i,i+1)\) 再進行一次操作,看看會發生什麼。\(f(i,i+1)\) 是若干段首尾相接的區間。每個區間會變成區間最小值和最大值為端點的新區間。由於區間是首尾相接的,因此新區間要麼首尾相接要麼相交得更多,而所有新區間的最左端點和最右端點一定等於所有區間的最小值和最大值,因此對這些 \(f(i,i+1)\) 再進行一次操作,得到的區間 \(=f^2(l,r)\)

以此類推,可以得到 \(f^k(l,r)=\cup_{i=l}^{r-1} f^k(i,i+1)\)

所以我們不需要求所有的 \(f(l,r)\),只需要求所有的 \(f^k(i,i+1)\)。然後是 RMQ 問題求區間最小值和最大值,ST 表即可。

因為 \(f(1,n)=[1,n]\),所以顯然操作 \(k\) 次能否得到區間 \([1,n]\)\(k\) 滿足單調性,\(k\) 越大越容易得到指定區間。

因此考慮倍增。先求所有 \(f^{2^0}(i,i+1)\),然後求所有 \(f^{2^1}(i,i+1)\),以此類推,每一層都要做一次 RMQ。時間和空間都是 \(O(n \log^2 n)\)

對每個詢問,倍增,每次計算 RMQ 判斷是否可以得到區間 \([1,n]\) 即可。時間複雜度 \(O(q \log n)\)

總時間複雜度是 \(O(n \log^2 n+q \log n)\)

據說貓樹可以單 \(\log\)?感覺不會啊,會的大佬歡迎分享。

相關文章