zzzyc

导航

[JSOI2008]最大数

线段树。。。板子。。。不能再板子了。。。

一开始用了cin读字符。。。结果bzoj上T了。。。

然后修改了一下。。。过了。。。

呆码:

#include<iostream>
#include<cstdio>
#define INF -99999999
#define N 200020
using namespace std;

int len,n,t,m,mo,sum[N<<2];
char ch;

inline void build(int rt,int l,int r)
{
    if(l==r)
    {
        sum[rt]=INF;
        return;
    }
    int mid=l+r>>1;
    build(rt<<1,l,mid);
    build(rt<<1|1,mid+1,r);
    sum[rt]=max(sum[rt<<1],sum[rt<<1|1]);
}

inline void update(int rt,int l,int r,int L,int k)
{
    if(l==r)
    {
        sum[rt]=k;
        return;
    }
    int mid=l+r>>1;
    if(L<=mid) update(rt<<1,l,mid,L,k);
    else update(rt<<1|1,mid+1,r,L,k);
    sum[rt]=max(sum[rt<<1],sum[rt<<1|1]);
}

inline int query(int rt,int l,int r,int L,int R)
{
    if(L<=l && r<=R)
    {
        return sum[rt];
    }
    int mid=l+r>>1;
    int ans=INF;
    if(L<=mid) ans=max(ans,query(rt<<1,l,mid,L,R));
    if(R>mid) ans=max(ans,query(rt<<1|1,mid+1,r,L,R));
    return ans;
}

int main()
{
    scanf("%d%d",&m,&mo);
    build(1,1,200000);

    for(int i=1;i<=m;i++)
    {
        ch='F';
        while(ch!='A' && ch!='Q') ch=getchar(); scanf("%d",&n);
        if(ch=='A') { update(1,1,N-20,len+1,(n+t)%mo); len+=1; }
        if(ch=='Q') { t=query(1,1,N-20,len-n+1,len); printf("%d\n",t); }
    }
}
代码

 

posted on 2018-07-13 17:28  zzzyc  阅读(165)  评论(0编辑  收藏  举报