1. 程式人生 > >【洛谷P2659】美麗的序列

【洛谷P2659】美麗的序列

long color cstring lin 定義 long long 解釋 har stream

題目背景

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<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using
namespace 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】美麗的序列