Maxnumber?暴力,其实暴力是能过的,但是我出的数据就不一定了。 我用的就是线段树吧,建一颗完整的树然后Logn修改,如果插入太多说不定会t掉唉#include<map> #include<queue> #include<cmath> #include<cctype> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define qread(x) x=read() #define mes(x,y) memset(x,y,sizeof(x)) #define mpy(x,y) memcpy(x,y,sizeof(x)) #define Maxn 200000 #define INF 2147483647 #define eps 1e-6 inline long long read(){ char ch=getchar(); long long f=1,x=0; while(!(ch>='0'&&ch<='9')){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+(ch-'0');ch=getchar();} return x*f; } struct Etree{ int l,r,lc,rc; long long c; }tr[2*Maxn+1];int trlen; void bt(int l,int r){ trlen++;int now=trlen; tr[now].l=l;tr[now].r=r;tr[now].c=0; if(l<r){ int mid=(l+r)/2; tr[now].lc=trlen+1; bt(l,mid); tr[now].rc=trlen+1; bt(mid+1,r); } } void change(int now,int p,int c){ if(tr[now].l==tr[now].r){tr[now].c=c;return;} int lc=tr[now].lc,rc=tr[now].rc,mid=(tr[now].l+tr[now].r)/2; if(p<=mid)change(lc,p,c); else change(rc,p,c); tr[now].c=std::max(tr[lc].c,tr[rc].c); } long long findmax(int now,int l,int r){ if(tr[now].l==l&&tr[now].r==r)return tr[now].c; int lc=tr[now].lc,rc=tr[now].rc,mid=(tr[now].l+tr[now].r)/2; if(r<=mid)return findmax(lc,l,r); else if(l>=mid+1)return findmax(rc,l,r); else return std::max(findmax(lc,l,mid),findmax(rc,mid+1,r)); } long long m,D,t,x;char s[10]; int main(){ qread(m);qread(D); trlen=0;bt(1,m); t=0;trlen=0; for(int i=1;i<=m;i++){ scanf("%s",s);qread(x); if(s[0]=='Q'){ printf("%lld\n",t=findmax(1,trlen-x+1,trlen)); } else{ change(1,++trlen,(x+t)%D); } } }
查看原文:http://hz2016.tk/blog/?p=67
09-19
09-19
09-19
12-19