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