max( 1 , x ) = min( x + 1 , x + y ) = max( x + y + 1 , n )
題目分析:昨晚上用單調棧寫的寫崩了,到現在還是不知道哪里寫崩了。。太拉胯了
因為這個題目給出的序列是需要靜態查詢最值,用 st 表或線段樹都可以快速查詢,因為感覺線段樹寫起來簡單就直接上線段樹了
最簡單的一種思路是直接 n^2 去枚舉兩個斷點,然后查找符合條件的答案,不過這種方法即使配合上 st 表時間復雜度也是有點高,所以考慮優化
枚舉其中的一個斷點肯定是無法避免的,我們假設枚舉的第一個斷點記為 x,此時 max( 1 , x ) 是已經確定了的,第一步先要去找到 y 的位置,使得 min( x + 1 , x + y ) == max( 1 , x ) 才行,不難看出的一個小結論是,對于一段前綴的最值來說,是具有單調性的,更具體的來說,前綴最大值隨著下標的遞增,這個值只會更大而不會減小,前綴最小值亦然,所以對于第二個斷點 y 我們可以直接二分去查找,此時我們已經確定下來了第一個斷點 x 的位置,設第一段的最大值為 mmax1,第二段的最小值為 mmin,第三段的最大值為 mmax2,此時分四種情況討論即可:
mmax1 < mmin:此時最小值的前綴偏大,需要擴大長度,故 l = mid + 1?
mmax1 > mmin:同上,r = mid - 1
mmax1 < mmax2:此時最大值的后綴偏大,需要減小長度,故 l = mid + 1?
mmax1 > mmax2:同上,r = mid - 1
需要注意的是,上面二分的是斷點 y 的位置,所以想要擴大 mmin 的長度就需要將 y 右移,同理如果想要擴大 mmax2 的長度就需要將 y 左移