P2659 美丽的序列

Posted WeiAR

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P2659 美丽的序列相关的知识,希望对你有一定的参考价值。

P2659 美丽的序列
对于当前的最小值,找到最大的左右边界,然后更新答案。用单调队列确定左右边界,O(n)做法。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<queue>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<ctime>
 7 #include<set>
 8 #include<map>
 9 #include<stack>
10 #include<cstring>
11 #define inf 2147483647
12 #define For(i,a,b) for(register long long i=a;i<=b;i++)
13 #define p(a) putchar(a)
14 #define g() getchar()
15 //by war
16 //2017.11.2
17 using namespace std;
18 long long ans;
19 long long n;
20 struct node
21 {
22     long long l,r;
23 }aa[2000010];
24 long long q[2000010];
25 long long l,r;
26 long long x;
27 long long a[2000010];
28 void in(long long &x)
29 {
30     long long y=1;
31     char c=g();x=0;
32     while(c<0||c>9)
33     {
34     if(c==-)
35     y=-1;
36     c=g();
37     }
38     while(c<=9&&c>=0)x=(x<<1)+(x<<3)+c-0,c=g();
39     x*=y;
40 }
41 void o(long long x)
42 {
43     if(x<0)
44     {
45         p(-);
46         x=-x;
47     }
48     if(x>9)o(x/10);
49     p(x%10+0);
50 }
51 int main()
52 {
53     in(n);
54     l=1,r=0;
55     For(i,1,n)
56     in(a[i]);
57     For(i,1,n)
58     {
59         while(l<=r&&a[q[r]]>=a[i])aa[q[r--]].r=i-1;
60         aa[i].l=q[r++]+1;
61         q[r]=i;
62     }
63     while(l<=r)aa[q[r--]].r=n;
64     For(i,1,n)
65     ans=max(ans,(aa[i].r-aa[i].l+1)*a[i]);
66     o(ans);
67      return 0;
68 }

 

以上是关于P2659 美丽的序列的主要内容,如果未能解决你的问题,请参考以下文章

P2659 美丽的序列

单调栈模板题 luogu P2659

[SOJ475]SPC #2美丽的序列 ~ Beautiful Sequence莫队哈希

和 Thrift 的一场美丽邂逅

转载和 Thrift 的一场美丽邂逅

bzoj3809:Gty的二逼妹子序列