標籤:zoj eof class max mem amp == 思路 void
題目:洛穀P1198、BZOJ1012
題目大意:要你維護一個數列,支援兩個操作:①查詢當前數列中末尾L個數裡的最大數;②讀入s,在數列尾部插入$(s+t)%D$(t是上次詢問的值,初始為0)。
解題思路:線段樹。m最大為200000,開一個線段樹,初始化為一個很小的值,然後直接插入、查詢即可。
C++ Code:
#include<cstdio>#include<algorithm>#include<cstring>#define N 200000using namespace std;int t=0,m,D,l,r,d[2*N+6],endd=0;char c[12];void insert(int L,int R,int o){ if(L==R){ d[o]=r; return; } int m=(L+R)>>1; if(endd<=m)insert(L,m,o<<1);else insert(m+1,R,o<<1|1); d[o]=max(d[o<<1],d[o<<1|1]);}int query(int L,int R,int o){ if(l<=L&&R<=r)return d[o]; int m=(L+R)>>1; int x=0x80808080,y=0x80808080; if(l<=m)x=query(L,m,o<<1); if(m<r)y=query(m+1,R,o<<1|1); return max(x,y);}int main(){ memset(d,0x80,sizeof(d)); scanf("%d%d",&m,&D); while(m--){ scanf("%s %d",c,&r); if(c[0]==‘A‘){ endd++; r=(r+t)%D; insert(1,N,1); }else{ l=endd-r+1; r=endd; t=query(1,N,1); printf("%d\n",t); } } return 0;}
[JSOI2008]最大數