P2659 美麗的序列 單調棧

2022-05-03 10:42:19 字數 667 閱讀 7505

題目

不斷求區間的最值問題,就用單調棧,記錄每個數前面第一次出現比自己小的數的小白

然後遍歷右區間對於右區間左邊,最小值是stk[top],即棧頂,而stk[top - 1]就是stk[top]左邊第乙個比stk[top]小的值

那麼區間就是\([stk[top - 1] + 1, i]\),區間最小值就是a[stk[top]]

但注意的是,我們在單調棧出棧的操作中求最大值,此時右區間i的值還沒有放進去,那麼久需要把區間大小減1

同時還需要變數一下棧,因為此時棧是乙個單調遞增的棧,再按照上面的方法求,只不過右區間是n

#include #include #define ll long long

using namespace std;

const int n = 2e6 + 5;

ll a[n], stk[n], ans[n], top, n;

int main()

stk[++top] = i;//入棧

}for(int i = 1; i <= top; i++)

ans = max(ans, a[stk[i]] * (n - stk[i - 1]));

printf("%lld\n", ans);

return 0;

}···

洛谷 P2659 美麗的序列

單調棧維護區間最小值,單調遞增棧維護區間最小值,考慮當前數對答案的貢獻,不斷加入數,如果加入的數 棧頂,說明棧頂的元素對當前數所在區間是有貢獻的,同時加入當前的數。反之,若當前加入的數比棧頂元素小,那麼棧頂元素 所謂的最小值 已經失去了價值,因為他不會再對後面的區間造成影響,所以彈出棧頂,同時更新 ...

洛谷P2659 美麗的序列

題目 該題目可以用輔助陣列l i r i 來指向以data i 為最小值的左端點和右端點。然後最後列舉每個data i 尋找每個data i 的美麗值的最大值。然後輔助陣列可以用單調棧求出。include include include include include include define ...

洛谷P2659 美麗的序列

gd是乙個熱衷於尋求美好事物的人,一天他拿到了乙個美麗的序列。為了研究這個序列的美麗程度,gd定義了乙個序列的 美麗度 和 美麗係數 對於這個序列的任意乙個區間 l,r 這個區間的 美麗度 就是這個區間的長度與這個區間的最小值的乘積,而整個序列的 美麗係數 就是它的所有區間的 美麗度 的最大值。現在...