1012: [JSOI2008]最大数maxnumber
题目:传送门
题解:
发现自己空了一道水题...
1~210000建线段树,其实就是一道裸题...
单点修改+区间查询...1A~
代码:
1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<cmath> 5 #include<algorithm> 6 #define qread(x)x=read(); 7 using namespace std; 8 inline int read() 9 { 10 int f=1,x=0;char ch; 11 while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();} 12 while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();} 13 return f*x; 14 } 15 struct node 16 { 17 int l,r,lc,rc,c; 18 }tr[410000];int len; 19 void bt(int l,int r) 20 { 21 len++;int now=len; 22 tr[now].l=l;tr[now].r=r;tr[now].c=0; 23 tr[now].lc=tr[now].rc=-1; 24 if(l<r) 25 { 26 int mid=(l+r)/2; 27 tr[now].lc=len+1;bt(l,mid); 28 tr[now].rc=len+1;bt(mid+1,r); 29 } 30 } 31 void change(int now,int x,int k) 32 { 33 if(tr[now].l==tr[now].r){tr[now].c=k;return ;} 34 int lc=tr[now].lc,rc=tr[now].rc; 35 int mid=(tr[now].l+tr[now].r)/2; 36 if(x<=mid)change(lc,x,k); 37 else if(mid+1<=x) change(rc,x,k); 38 tr[now].c=max(tr[lc].c,tr[rc].c); 39 } 40 int findmax(int now,int l,int r) 41 { 42 if(l==tr[now].l && tr[now].r==r)return tr[now].c; 43 int lc=tr[now].lc,rc=tr[now].rc; 44 int mid=(tr[now].l+tr[now].r)/2; 45 if(r<=mid)return findmax(lc,l,r); 46 else if(mid+1<=l)return findmax(rc,l,r); 47 else return max(findmax(lc,l,mid),findmax(rc,mid+1,r)); 48 } 49 int main() 50 { 51 int M,D,t=0,ans,num; 52 qread(M);qread(D); 53 char c[5];len=0; 54 bt(1,210000);num=0; 55 for(int i=1;i<=M;i++) 56 { 57 int x; 58 scanf("%s",c);qread(x); 59 if(c[0]=='A') 60 change(1,++num,(x+t)%D); 61 else 62 { 63 t=findmax(1,num-x+1,num); 64 printf("%d ",t); 65 } 66 } 67 return 0; 68 }