hdu 4669 模拟

思路:

主要就是模拟这些操作,用链表果断超时。改用堆栈模拟就过了

#include<map>
#include<set>
#include<stack>
#include<cmath>
#include<queue>
#include<cstdio>
#include<vector>
#include<string>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define Maxn 1000010
#define Maxm 300010
#define LL __int64
#define Abs(x) ((x)>0?(x):(-x))
#define lson(x) (x<<1)
#define rson(x) (x<<1|1)
#define inf 0x7fffffff
#define Mod 1000000007
int Max[Maxn],sum[Maxn];
using namespace std;
stack<int> br,af;
int main()
{
    int i,j,u,v,n,x;
    char str[3];
    int brz,afz;
    while(scanf("%d",&n)!=EOF){
    brz=afz=0;
    while(!br.empty())
    br.pop();
    while(!af.empty())
    af.pop();
    sum[0]=0;
    Max[0]=-100000;
    for(i=1;i<=n;i++){
        scanf("%s",str);
        if(str[0]=='I'){
            scanf("%d",&x);
            br.push(x);
            sum[++brz]=sum[brz-1]+x;
            Max[brz]=max(Max[brz-1],sum[brz]);
        }
        if(str[0]=='D'){
            if(br.empty()) continue;
            br.pop();
            --brz;
        }
        if(str[0]=='L'){
            if(!br.empty()){
                int temp=br.top();
                br.pop();
                --brz;
                af.push(temp);
                ++afz;
            }
        }
        if(str[0]=='R'){
            if(!af.empty()){
                int temp=af.top();
                af.pop();
                br.push(temp);
                --afz;
                sum[++brz]=sum[brz-1]+temp;
                Max[brz]=max(Max[brz-1],sum[brz]);
            }
        }
        if(str[0]=='Q'){
            scanf("%d",&x);
            if(x>=brz)
                printf("%d\n",Max[brz]);
            else
                printf("%d\n",Max[x]);
        }
    }
    }
    return 0;
}

 

posted @ 2013-08-23 15:31  fangguo  阅读(175)  评论(0编辑  收藏  举报