jsoi2008最大数bzoj1012

题意就是维护一个队列,支持查询最近插入的L个数里面的最大值和插入,所以我们可以使用单调栈,单调队列之类的写,线段树平衡树当然可以只不过我们需要在比赛中尽量的节省时间,当然平常我们也可以练习一下,线段树很直观,直接做,平衡树加入一个插入标记,把查询L个数中最早插入的splay树根,最近的splay到右子树然后似乎就可以做了?有时间写一发试下啊咧《这莫非又是坑?
#include<cstdio>
#include<algorithm>
using namespace std;
int a[200005],top,b[200005],ans,inf;
int n,flag;

int main()
{
        scanf("%d%d",&n,&inf);
        for (int i=1;i<=n;i++)
        {
                char op[1];int x;
                scanf("%s %d",op,&x);
                if (op[0]=='A')
                {
                        x+=ans;
                        x%=inf;
                        b[++b[0]]=x;
                        while (top&&b[a[top]]<=x) top--;
                        a[++top]=b[0];
                }
                else
                {
                        int t=lower_bound(a+1,a+top+1,b[0]-x+1)-a;
                        ans=b[a[t]];
                        printf("%d\n",ans);
                }
        }
        return 0;
}

你可能感兴趣的:(数据结构,线段树,单调栈,单调队列)