题目:http://poj.org/problem?id=3667
线段树,区间合并的经典题。。。但是。。我的一个语法错误。。花了我一下午的时间才找到。。 我居然写成了这样。T[id].lzy?:m>>1; 少写了一个零,
太不细心了!!!!!
下面是AC代码:
#include<cstdio> #include<algorithm> #define L(r) r<<1 #define R(r) r<<1|1 using namespace std; const int maxn =55000+10; struct node{ int l,r; int msum,lsum,rsum,lazy; }T[maxn<<2]; void build(int id,int l,int r){ T[id].l=l;T[id].r=r; T[id].msum=T[id].lsum=T[id].rsum=r-l+1; T[id].lazy=-1; if(l==r) return ; int m=(l+r)>>1; build(id<<1,l,m); build(id<<1|1,m+1,r); } void pushdown(int id,int l, int r){ if(T[id].lazy!=-1){ int m=(l+r)>>1; T[id<<1].lazy=T[id<<1|1].lazy=T[id].lazy; T[id<<1].msum=T[id<<1].lsum=T[id<<1].rsum=(T[id].lazy?0:m-l+1) ; T[id<<1|1].msum=T[id<<1|1].lsum=T[id<<1|1].rsum=( T[id].lazy?0: r-m); T[id].lazy=-1; } } void pushup(int id,int l,int r){ int m=(l+r)>>1; T[id].lsum=T[id<<1].lsum; T[id].rsum=T[id<<1|1].rsum; T[id].msum=max(T[id<<1].msum,T[id<<1|1].msum); if(T[id<<1].lsum==m-l+1) T[id].lsum+=T[id<<1|1].lsum; if(T[id<<1|1].rsum==r-m) T[id].rsum+=T[id<<1].rsum; T[id].msum=max(T[id].msum,max(T[id].lsum,T[id].rsum)); T[id].msum=max(T[id].msum,T[id<<1].rsum+T[id<<1|1].lsum); } void update(int id,int l,int r,int val){ if(T[id].l==l&&T[id].r==r){ T[id].lazy=val; T[id].msum=T[id].lsum=T[id].rsum=val?0:r-l+1; return ; } pushdown(id,T[id].l,T[id].r); int m=(T[id].l+T[id].r)>>1; if(m>=r) update(id<<1,l,r,val); else if(m<l) update(id<<1|1,l,r,val); else{ update(id<<1,l,m,val); update(id<<1|1,m+1,r,val); } pushup(id,T[id].l,T[id].r); } int query(int id,int l,int r,int val){ if(T[id].l==T[id].r) return T[id].l; pushdown(id,l,r); int m=(T[id].l+T[id].r)>>1; if(T[id<<1].msum>=val){ return query(id<<1,l,m,val); } else if(T[id<<1].rsum+T[id<<1|1].lsum>=val){ return m-T[id<<1].rsum+1; } return query(id<<1|1,m+1,r,val); } int main(){ int n,m; int p,a,b; scanf("%d%d",&n,&m); build(1,1,n); for(int i=0;i<m;i++){ scanf("%d",&p); if(p==1){ scanf("%d",&a); if(T[1].msum>=a){ int start= query(1 , 1 , n , a); printf("%d\n",start); update(1,start,start+a-1,1); } else{ printf("0\n"); } } else{ scanf("%d%d",&a,&b); update(1,a,a+b-1,0); } } return 0; }