HDU/HDOJ 4699 Editor
对顶栈算法。
此题充分说明了cin的不中以及scanf的优越性。
我TM用cin超时了!!!换成scanf就A了!!!
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 const int N = 1e6 + 5, INF = 0x3f3f3f3f; 5 inline int max(int a, int b) { 6 return a > b ? a : b; 7 } 8 9 struct DZ { 10 int l[N], r[N], sum[N], large[N]; 11 int tl, tr; 12 DZ() { 13 memset(l, 0, sizeof(l)); 14 memset(r, 0, sizeof(r)); 15 tl = tr = sum[0] = 0; 16 large[0] = -INF; 17 } 18 void clear() { 19 tl = tr = 0; 20 return; 21 } 22 void insert(int x) { 23 l[++tl] = x; 24 sum[tl] = sum[tl - 1] + x; 25 large[tl] = max(large[tl - 1], sum[tl]); 26 return; 27 } 28 void del() { 29 tl--; 30 return; 31 } 32 void left() { 33 if(tl) { 34 r[++tr] = l[tl--]; 35 } 36 return; 37 } 38 void right() { 39 if(tr) { 40 insert(r[tr--]); 41 } 42 return; 43 } 44 int ask(int k) { 45 return large[k]; 46 } 47 }dz; 48 49 int main() { 50 int Q; 51 while(scanf("%d", &Q) != EOF) { 52 dz.clear(); 53 for(int i = 1; i <= Q; i++) { 54 char a[2]; int x; 55 scanf("%s", a); 56 if(a[0] == 'I') { 57 scanf("%d", &x); 58 dz.insert(x); 59 } 60 else if(a[0] == 'D') { 61 dz.del(); 62 } 63 else if(a[0] == 'L') { 64 dz.left(); 65 } 66 else if(a[0] == 'R') { 67 dz.right(); 68 } 69 else { 70 scanf("%d", &x); 71 printf("%d\n", dz.ask(x)); 72 } 73 } 74 } 75 return 0; 76 }