luogu 1901 发射站

题目大意:

一个数列,它左边第一个比它高的人和右边第一个比它高的人要加上它的权值

思路:

单调栈维护一个单调递减的栈

正反各维护一遍

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<cstring>
 6 #include<cstdlib>
 7 #include<set>
 8 #include<map>
 9 #include<vector>
10 #include<stack>
11 #include<queue>
12 #define ll long long
13 #define inf 2147383611
14 #define MAXN 1001001
15 using namespace std;
16 inline ll read()
17 {
18     ll x=0,f=1;
19     char ch;ch=getchar();
20     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
21     while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
22     return x*f;
23 }
24 int n,a[MAXN],v[MAXN],st[MAXN],top,ans[MAXN],maxn;
25 int main()
26 {
27     n=read();
28     for(int i=1;i<=n;i++) a[i]=read(),v[i]=read();
29     for(int i=1;i<=n;i++)
30     {
31         while(top&&a[st[top]]<=a[i]) top--;
32         ans[st[top]]+=v[i];
33         st[++top]=i;
34     }
35     top=0;
36     for(int i=n;i>=1;i--)
37     {
38         while(top&&a[st[top]]<=a[i]) top--;
39         ans[st[top]]+=v[i];
40         st[++top]=i;
41     }
42     for(int i=1;i<=n;i++) maxn=max(maxn,ans[i]);
43     printf("%d",maxn);
44 }
View Code
posted @ 2017-10-23 19:38  jack_yyc  阅读(93)  评论(0编辑  收藏  举报