tyvj4875 排列(單調棧)

2021-08-08 21:42:04 字數 1301 閱讀 4763

傳送門

自從比賽我打錯了這題的60分暴力後,我幼小的內心中留下了一道陰影。

多組資料一定要記得清空全域性變數和陣列啊啊啊!!!

甚至為了吸取教訓,我還準備專門寫一篇。。

這題的60分做法就是固定左端點,隨著右端點的右移更新最值並貢獻答案。考慮100分的做法,當時良久都不知道怎麼做,都在想有什麼資料結構能大顯神通,結果比賽後看了題解,發現做法很玄學。

由於排列是隨機的,暴力解法中,固定左端點後,更新最大最小值成功的次數大約是logn級別的(別問我問什麼),於是我們只需要預處理出,最大值或最小值變化的那個點,然後中間的那些可以一起算。

我們從右往左左,考慮如何快速求出第乙個比i大(小)的j。我們可以利用各種資料結構,線段樹平衡樹之類的,但是最簡潔強大的還是單調棧。我們以求第乙個比i大的位置為例,我們維護乙個單調下降的的棧(從底到頂),如果在棧頂小於等於當前值就將其彈出,記錄棧頂即可。插入則直接插入棧頂。保證棧頂的元素一定是最小的那個。這樣假設a[i+1]>a[i],i+1就是答案,否則答案也必然在棧中(只用想想彈出的前提是什麼)。另乙個棧也差不多。

這樣我們在列舉r的時候,同時記錄一下[l,r]的最大值和最小值,然後看看哪個先變化就讓r跳過去,同時計算答案、更新當前最值就可以了。而這樣的時間複雜度是o(

nlog

n)的。

tyvj4875 排列(單調棧)

既然是讓我兩天都想不明白的題,就寫總結吧。題面題意 給你乙個n個數的隨機排列,設ans k 為區間內 最大值 最小值 k的區間個數。求ans 0 n 1 暴力就是固定左端點,右端點不斷向右拓展,用得到的新數來更新當前最大值與最小值。實際操作中,我們發現很多次拓展都不能更新最大值與最小值。就萌發出乙個...

hdu 1716 排列2 排列組合

問題描述 ray又對數字的列產生了興趣 現有四張卡片,用這四張卡片能排列出很多不同的4位數,要求按從小到大的順序輸出這些4位數 input 每組資料佔一行,代表四張卡片上的數字 0 數字 9 如果四張卡片都是0,則輸入結束。output 對每組卡片按從小到大的順序輸出所有能由這四張卡片組成的4位數,...

197 排列序號

是 這道題採取暴力解法會超時,應當對於原陣列的每乙個位置找到其後有多少個數比它小,然後再相加這些數與對應的權的成績。class solution long long ans 1,fac 1,cc 1 for int i len 2 i 0 i ans fac cc c i return ans 注意...