poj 3667

题目: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;
}


你可能感兴趣的:(poj 3667)