#define lson rt<<1
#define rson rt<<1|1
void BuildTree(int l, int r, int rt)
{
lazy[rt] = -1;
lsum[rt] = rsum[rt] = sum[rt] = r-l+1;
if (l == r) return ;
int m = (l+r)>>1;
BuildTree(lson);
BuildTree(rson);
}
void update(int r,int l,int L,int R,int c,int rt){//c是标志位
if([l,r] belong to[L,R]){
lsum[rt]=rsum[rt]=sum[rt]=c?0:r-l+1;
cover[rt]=c;//0表示未占用
}
pushdown(rt,r-l+1);
int mid=(l+r)>>1;
update(lson);
update(rson);
pushup(rt,r-l+1);
}
void pushup(int rt,int len){
lsum[rt]=lsum[rt<<1];
rsum[rt]=rsum[rt<<1|1];
if(lsum[rt]==len-len>>1) lsum[rt]+=lsum[rt<<1|1];
if(rsum[rt]==len>>1) rsum[rt]+=rsum[rt<<1];
sum[rt]=max(lsum[rt<<1],rsum[rt<<1+1],rsum[rt<<1|1]+lsum[rt<<1]);
}
void pushdown(int rt,int len){
if(cover[rt]!=-1){
cover[rt<<1|1]=cover[rt<<1]=cover[rt];
lsum[rt<<1]=rsum[rt<<1]=sum[rt<<1]=cover[rt]?0:len-len>>1;
lsum[rt<<1|1]=rsum[rt<<1|1]=sum[rt<<1|1]=cover[rt]?0:len>>1;
cover[rt]=-1;
}
}
int query(int w, int l, int r, int rt)
{
if (l == r) return 1;
PushDown(rt, r-l+1);
int m = (l+r)>>1;
if (sum[rt<<1] >= w)
return query(w, lson);
else if (rsum[rt<<1]+lsum[rt<<1|1] >= w)
return m-rsum[rt<<1]+1;
else
return query(w, rson);
}
query finish:
update(pos,pos+w-1,1,n,1,1);//c=1 标志被占用
线段树区间合并 维护连续区间长度 模版(自己)
最新推荐文章于 2019-12-12 18:45:34 发布