3250

1 /*
2 堆栈练习好题
3
4 也可线段树过
5 */
6
7 // include file
8 #include <cstdio>
9 #include <cstdlib>
10 #include <cstring>
11 #include <cmath>
12 #include <cctype>
13 #include <ctime>
14
15 #include <iostream>
16 #include <sstream>
17 #include <fstream>
18 #include <iomanip>
19 #include <bitset>
20 #include <strstream>
21
22 #include <algorithm>
23 #include <string>
24 #include <vector>
25 #include <queue>
26 #include <set>
27 #include <list>
28 #include <functional>
29
30 using namespace std;
31
32 // typedef
33 typedef long long LL;
34 typedef unsigned long long ULL;
35 typedef __int64 Bint;
36
37 //
38 #define read freopen("in.txt","r",stdin)
39 #define write freopen("out.txt","w",stdout)
40 #define FORi(a,b,c) for(int i=(a);i<(b);i+=c)
41 #define FORj(a,b,c) for(int j=(a);j<(b);j+=c)
42 #define FORk(a,b,c) for(int k=(a);k<(b);k+=c)
43 #define FORp(a,b,c) for(int p=(a);p<(b);p+=c)
44 #define FORii(a,b,c) for(int ii=(a);ii<(b);ii+=c)
45 #define FORjj(a,b,c) for(int jj=(a);jj<(b);jj+=c)
46 #define FORkk(a,b,c) for(int kk=(a);kk<(b);kk+=c)
47
48 #define FF(i,a) for(int i=0;i<(a);i+++)
49 #define FFD(i,a) for(int i=(a)-1;i>=0;i--)
50 #define Z(a) (a<<1)
51 #define Y(a) (a>>1)
52
53 const double eps = 1e-6;
54 const double INFf = 1e10;
55 const int INFi = 1000000000;
56 const double Pi = acos(-1.0);
57
58 template<class T> inline T sqr(T a){return a*a;}
59 template<class T> inline T TMAX(T x,T y)
60 {
61 if(x>y) return x;
62 return y;
63 }
64 template<class T> inline T TMIN(T x,T y)
65 {
66 if(x<y) return x;
67 return y;
68 }
69 template<class T> inline void SWAP(T &x,T &y)
70 {
71 T t = x;
72 x = y;
73 y = t;
74 }
75 template<class T> inline T MMAX(T x,T y,T z)
76 {
77 return TMAX(TMAX(x,y),z);
78 }
79
80
81 // code begin
82 #define MAXN 80010
83 int N;
84 int stk[MAXN],top,a;
85 int stk2[MAXN],top2;
86 Bint ans;
87 int main()
88 {
89 read;
90 write;
91 while(scanf("%d",&N)!=-1)
92 {
93 top = 0;
94 top2 = 0;
95 ans = 0;
96 FORi(0,N,1)
97 {
98 scanf("%d",&a);
99 if(top==0 || a<stk[top-1])
100 {
101 stk[top++]=a;
102 stk2[top2++] = 0;
103 }
104 else
105 {
106 //如果要插入的元素比栈顶元素大于等于的话
107 //退栈
108 while(top>=1&&stk[top-1]<=a)
109 {
110 ans += stk2[top2-1];
111 if(top2>=2) stk2[top2-2] += stk2[top2-1]+1;
112 stk2[top2-1] = 0;
113 top2--;
114 top--;
115 }
116
117 stk[top++]=a;
118 stk2[top2++]=0;
119 }
120 }
121 while(top>=1)
122 {
123 ans += stk2[top2-1];
124 if(top2>=2) stk2[top2-2] += stk2[top2-1]+1;
125 stk2[top2-1]=0;
126 top2--;
127 top--;
128 }
129 printf("%I64d\n",ans);
130 }
131 return 0;
132 }
posted @ 2011-03-09 20:01  AC2012  阅读(202)  评论(0编辑  收藏  举报