【洛谷P2659】美麗的序列
阿新 • • 發佈:2017-08-06
long color cstring lin 定義 long long 解釋 har stream
輸出樣例#1:
題目背景
GD是一個熱衷於尋求美好事物的人,一天他拿到了一個美麗的序列。
題目描述
為了研究這個序列的美麗程度,GD定義了一個序列的“美麗度”和“美麗系數”:對於這個序列的任意一個區間[l,r],這個區間的“美麗度”就是這個區間的長度與這個區間的最小值的乘積,而整個序列的“美麗系數”就是它的所有區間的“美麗度”的最大值。現在GD想要你幫忙計算這個序列的“美麗系數”。
輸入輸出格式
輸入格式:
第一行一個整數n,代表序列中的元素個數。 第二行n個整數a1、a2?an,描述這個序列。
輸出格式:
一行一個整數,代表這個序列的“美麗系數”。
輸入輸出樣例
輸入樣例#1:3 1 2 3
4
說明
樣例解釋 選取區間[2,3],可以獲得最大“美麗系數”為2*2=4。 數據範圍 對於20%的數據,n<=2000; 對於60%的數據,n<=200000; 對於100%的數據,1<=n<=2000000,0<=ai<=2000000。 提示 你可能需要一個讀入優化。
題解
暴力的話一定會超時,我們先固定最小值,然後找出以這個值為最小值的最大區間,然後枚舉就行了。不要忘記開long long!
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> usingnamespace std; typedef long long ll; const int maxn=2000000+5; inline int read() { int x=0,f=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1; ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} return x*f; } int n; int a[maxn],l[maxn],r[maxn]; ll ans=-1; int main() { n=read(); for(int i=1;i<=n;i++) { a[i]=read(); l[i]=r[i]=i; } a[0]=a[n+1]=-1; for(int i=1;i<=n;i++) { int j=i-1; while(a[j]>=a[i]) { l[i]=l[j]; j=l[j]-1; } } for(int i=n;i>=1;i--) { int j=i+1; while(a[j]>=a[i]) { r[i]=r[j]; j=r[j]+1; } } for(int i=1;i<=n;i++) { ll tmp=(ll)(r[i]-l[i]+1)*(ll)a[i]; ans=max(tmp,ans); } printf("%lld\n",ans); return 0; }
【洛谷P2659】美麗的序列