[BZOJ1012][JSOI2008]最大数maxnumber 线段树

Posted halfrot

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[BZOJ1012][JSOI2008]最大数maxnumber 线段树相关的知识,希望对你有一定的参考价值。

没什么好说的……线段树维护区间就行了。第一次居然写错了,真丢人。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 typedef long long ll;
 6 ll inline readll(){
 7     ll Num;char ch;
 8     while((ch=getchar())<0||ch>9);Num=ch-0;
 9     while((ch=getchar())>=0&&ch<=9) Num=Num*10+ch-0;
10     return Num;
11 }
12 void outll(ll x){
13     if(x>=10) outll(x/10);
14     putchar(x%10+0);
15 }
16 int mx[200010<<2],len=0;
17 #define lson l,mid,rt<<1
18 #define rson mid+1,r,rt<<1|1
19 void Pushup(int &rt){
20     mx[rt]=max(mx[rt<<1],mx[rt<<1|1]);
21 }
22 void Add(int l,int r,int rt,int pos,int x){
23     if(l==r){
24         mx[rt]=x;
25         return;
26     }
27     int mid=l+r>>1;
28     if(pos<=mid) Add(lson,pos,x);
29     else Add(rson,pos,x);
30     Pushup(rt);
31 }
32 int Qry(int l,int r,int rt,int L,int R){
33     if(l>=L&&R>=r) return mx[rt];
34     int mid=l+r>>1,ret=0;
35     if(L<=mid) ret=max(ret,Qry(lson,L,R));
36     if(R>mid) ret=max(ret,Qry(rson,L,R));
37     return ret;
38 }
39 int main(){
40     int m=readll(),
41         d=readll();
42     char opt[5];
43     ll t=0,num;
44     memset(mx,0,sizeof(mx));
45     for(int i=1;i<=m;i++){
46         scanf("%s",opt);
47         num=readll();
48         if(opt[0]==A) Add(1,m,1,++len,(num%d+t%d)%d);
49         else{
50             t=Qry(1,m,1,len-num+1,len);
51             outll(t);
52             putchar(\n);
53         }
54     }
55     return 0;
56 }

 

以上是关于[BZOJ1012][JSOI2008]最大数maxnumber 线段树的主要内容,如果未能解决你的问题,请参考以下文章

bzoj1012[JSOI2008]最大数maxnumber

BZOJ 1012: [JSOI2008]最大数maxnumber

BZOJ1012: [JSOI2008]最大数maxnumber [线段树]

单调栈 BZOJ1012 [JSOI2008]最大数maxnumber

BZOJ1012:[JSOI2008]最大数——题解

BZOJ 1012 [JSOI2008]最大数maxnumber