标签:
题目链接:http://codeforces.com/problemset/problem/442/C
题目大意:一个数列,有n个元素。你可以做n-2次操作,每次操作去除一个数字,并且得到这个数字两边相邻的数最小的分数。问你最多得到多少分。
将高度绘图,去除V的情况。
用单调栈优化,每个元素进栈一次,出栈一次。线性时间。
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <vector> 5 #include <map> 6 #include <set> 7 #include <bitset> 8 #include <cmath> 9 #include <numeric> 10 #include <iterator> 11 #include <iostream> 12 #include <cstdlib> 13 #include <functional> 14 #include <queue> 15 #include <stack> 16 #include <string> 17 #include <cctype> 18 using namespace std; 19 #define PB push_back 20 #define MP make_pair 21 #define SZ size() 22 #define ST begin() 23 #define ED end() 24 #define CLR clear() 25 #define ZERO(x) memset((x),0,sizeof(x)) 26 typedef long long LL; 27 typedef unsigned long long ULL; 28 typedef pair<int,int> PII; 29 const double EPS = 1e-8; 30 31 const int MAX_N = 5*1e5+100; 32 int n,top; 33 LL st[MAX_N]; 34 35 int main() { 36 cin >> n; 37 top = -1; 38 LL ans = 0; 39 for(int i=0;i<n;i++){ 40 LL x; 41 cin >> x; 42 while( top>=1 && st[top]<st[top-1]&&st[top]<=x ){ 43 ans += min(st[top-1],x); 44 top--; 45 } 46 st[++top] = x; 47 } 48 sort(st,st+top+1); 49 for(int i=0;i<top-1;i++) ans += st[i]; 50 cout << ans << endl; 51 return 0; 52 }
[CF442C] Artem and Array (贪心+单调栈优化)
标签:
原文地址:http://www.cnblogs.com/llkpersonal/p/4541339.html