bzoj1012: [JSOI2008]最大数maxnumber(貌似是道线段树喔)

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\n",t);
65         }
66     }
67     return 0;
68 }

 

 

 

 

 

posted @ 2017-12-25 13:28  CHerish_OI  阅读(206)  评论(0编辑  收藏  举报