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;

}

 

你可能感兴趣的:(HDU)