BZOJ-1012 [JSOI2008]最大数maxnumber
水水水,最水的题又来了~~~
纯纯的线段树~~撒花
题目: http://www.lydsy.com/JudgeOnline/problem.php?id=1012
真的是最最最最撒比的线段树。。。不过要构造一个m大小的。。。不然存起来好麻烦
一开始check里面的判断条件写反了QAQ样例怎么也过不了
代码
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #define MM 200020 using namespace std; char ch[10]; int mx[MM*4],a[MM]; int la,l,n,m,t,d,mm; void change(int ll,int rr,int st) { if (ll==rr) { mx[st]=n; return; } int mid=(ll+rr)/2; if (l<=mid) change(ll,mid,st<<1); else change(mid+1,rr,(st<<1)+1); mx[st]=max(mx[st<<1],mx[(st<<1)+1]); return; } int check(int ll,int rr,int l,int r,int st) { if (ll<=l&&rr>=r) return mx[st]; int sum=0,mid=(l+r)/2; if (ll<=mid) sum=max(sum,check(ll,rr,l,mid,st<<1)); if (rr>mid) sum=max(sum,check(ll,rr,mid+1,r,(st<<1)+1)); return sum; } int main() { scanf("%d%d",&m,&d); t=l=0; mm=m; memset(mx,0,sizeof(mx)); while (m--) { scanf("%s%d",&ch,&n); l++; if (ch[0]=='A') { a[++la]=l; n=(n%d+t%d)%d; change(1,mm,1); } else { printf("%d\n",t=check(a[la-n+1],a[la],1,mm,1)); t%=d; } } return 0; }