题目大意:M次询问,答案模D ,A x是添加值(x+t)%D到队列最后,Q x是输出当前状态最后x个数的最大值,t初始为0,每次输出更新t为输出的值
思路:比较简单的线段树,长度可以定为M或者200000(最大),只需要A 就添加值,更新最值,Q就搜索区间最大值,输出,很简单,为什么要写博客???
这个题真的是太坑了!!本来自己做的,感觉这个题还挺简单的,但是!交了N遍都是RE,,实在没有办法了,看题解,跟题解一个思路,但是就是RE!!搞了两个小时,一句一句的对,最后发现竟然是scanf的问题。。。。。用cin这里就RE!!!!
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define mod 200005
using namespace std;
long long maxx(long long a,long long b)
{
if(a<b) return b;
return a;
}
long long D,f[mod*4],T=0;
int M;
void add(int l,int r,int rt,int poit,long long num)
{
//cout<<l<<" "<<r<<" "<<rt<<" "<<poit<<" "<<D<<endl;
if(l==r) {f[rt]=num;return;}
int mid=(l+r)/2;
if(poit<=mid) add(l,mid,rt*2,poit,num);
else add(mid+1,r,rt*2+1,poit,num);
f[rt]=maxx(f[rt*2],f[rt*2+1]);
}
long long query(int l,int r,int rt,int L,int R)
{
if(L<=l&&R>=r) return f[rt];
int mid=(l+r)/2;
if(R<=mid) return query(l,mid,rt*2,L,R);
else if(L>mid) return query(mid+1,r,rt*2+1,L,R);
else return maxx(query(l,mid,rt*2,L,R),query(mid+1,r,rt*2+1,L,R));
}
int main()
{
scanf("%d%lld",&M,&D);
long long k=0,x,kk=0,z;
for(int i=1;i<=M;i++)
{
char ch;
ch=getchar();
while(ch!='Q'&&ch!='A')
ch=getchar();
scanf("%d",&x);
if(ch=='A')
{
k++;
z=(x+T)%D;
add(1,M,1,k,z);
}
else
{
T=query(1,M,1,k-x+1,k);
printf("%lld\n",T);
}
}
return 0;
}