洛谷P2659 美麗的序列

2022-06-03 22:12:14 字數 1164 閱讀 9333

gd是乙個熱衷於尋求美好事物的人,一天他拿到了乙個美麗的序列。

為了研究這個序列的美麗程度,gd定義了乙個序列的「美麗度」和「美麗係數」:對於這個序列的任意乙個區間[l,r],這個區間的「美麗度」就是這個區間的長度與這個區間的最小值的乘積,而整個序列的「美麗係數」就是它的所有區間的「美麗度」的最大值。現在gd想要你幫忙計算這個序列的「美麗係數」。

輸入格式:

第一行乙個整數n,代表序列中的元素個數。 第二行n個整數a1、a2„an,描述這個序列。

輸出格式:

一行乙個整數,代表這個序列的「美麗係數」。

輸入樣例#1:

3 

1 2 3

輸出樣例#1:

4

樣例解釋 選取區間[2,3],可以獲得最大「美麗係數」為2*2=4。 資料範圍 對於20%的資料,n<=2000; 對於60%的資料,n<=200000; 對於100%的資料,1<=n<=2000000,0<=ai<=2000000。 提示 你可能需要乙個讀入優化。

暴力的話一定會超時,我們先固定最小值,然後找出以這個值為最小值的最大區間,然後列舉就行了。不要忘記開long long!

#include#include

#include

#include

using

namespace

std;

typedef

long

long

ll;const

int maxn=2000000+5

;inline

intread()

while(ch>='

0'&&ch<='9')

return x*f;

}int

n;int

a[maxn],l[maxn],r[maxn];

ll ans=-1

;int

main()

a[0]=a[n+1]=-1

;

for(int i=1;i<=n;i++)

}for(int i=n;i>=1;i--)

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

printf(

"%lld\n

",ans);

return0;

}

洛谷 P2659 美麗的序列

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

洛谷P2659 美麗的序列

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

題解洛谷 P2659 美麗的序列

看到題解區基本全是單調棧,我來乙個不同的思路 用並查集來貪心。這是乙個比較經典的 trick,常用來批量處理一條鏈 一棵樹上路徑的最大或最小值問題,大致的思路是按順序列舉每一條邊,並查集維護連通塊來算貢獻。具體到本題,我們可以把數列抽象成一條 n 1 點 n 邊的鏈,i 與 i 1 之間的邊權為 a...