您的位置:首页 > 其它

poj3667(线段树区间合并)

2017-08-27 18:22 501 查看
链接:点击打开链接

题意:给出包含n个元素初始为0的数组,有两种操作,一种返回连续是0的长度为d的最左边的下标并区间更新成1,另一种将区间更新为0

代码:#include <queue>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int siz=50005;
int lazy[siz<<2];
int sum[siz<<2],lsum[siz<<2],rsum[siz<<2];
void build(int l,int r,int rt){
lazy[rt]=-1;
sum[rt]=lsum[rt]=rsum[rt]=r-l+1;
if(l==r)
return;
int m=(l+r)>>1;
build(l,m,rt<<1);
build(m+1,r,rt<<1|1);
}
void pushup(int rt,int p){
lsum[rt]=lsum[rt<<1];
rsum[rt]=rsum[rt<<1|1];
if(lsum[rt<<1]==(p-(p>>1)))
lsum[rt]+=lsum[rt<<1|1];
if(rsum[rt<<1|1]==(p>>1))
rsum[rt]+=rsum[rt<<1]; //区间进行合并
sum[rt]=max(sum[rt<<1],sum[rt<<1|1]);
sum[rt]=max(sum[rt],rsum[rt<<1]+lsum[rt<<1|1]);
}
void pushdown(int rt,int p){
if(lazy[rt]!=-1){ //懒惰标记
if(lazy[rt]==0){
lazy[rt<<1]=lazy[rt<<1|1]=0;
sum[rt<<1]=lsum[rt<<1]=rsum[rt<<1]=p-(p>>1);
sum[rt<<1|1]=lsum[rt<<1|1]=rsum[rt<<1|1]=(p>>1);
}
else{
lazy[rt<<1]=lazy[rt<<1|1]=1;
sum[rt<<1]=lsum[rt<<1]=rsum[rt<<1]=0;
sum[rt<<1|1]=lsum[rt<<1|1]=rsum[rt<<1|1]=0;
}
lazy[rt]=-1;
}
}
void Change(int L,int R,int p,int l,int r,int rt){
if(L<=l&&r<=R){
lazy[rt]=p;
if(p==0)
sum[rt]=lsum[rt]=rsum[rt]=r-l+1;
else
sum[rt]=lsum[rt]=rsum[rt]=0;
return;
}
pushdown(rt,r-l+1);
int m=(l+r)>>1;
if(L<=m)
Change(L,R,p,l,m,rt<<1);
if(R>m)
Change(L,R,p,m+1,r,rt<<1|1);
pushup(rt,r-l+1);
}
int query(int p,int l,int r,int rt){
if(l==r)
return l;
pushdown(rt,r-l+1);
int m=(l+r)>>1;
if(sum[rt<<1]>=p)
return query(p,l,m,rt<<1);
else if(rsum[rt<<1]+lsum[rt<<1|1]>=p)
return m-rsum[rt<<1]+1;
else
return query(p,m+1,r,rt<<1|1);
}
int main(){ //sum[rt]表示rt这个节点最长连续0
int n,m,u,v,w,op; //lsum[rt]表示从rt区间左端点开始最长连续0
while(scanf("%d%d",&n,&m)!=EOF){ //rsum[rt]表示从rt区间右端点开始最长连续0
build(1,n,1);
while(m--){
scanf("%d",&op);
if(op==1){
scanf("%d",&u);
if(sum[1]<u)
puts("0");
else{
w=query(u,1,n,1);
printf("%d\n",w);
Change(w,w+u-1,1,1,n,1);
}
}
else{
scanf("%d%d",&u,&v);
Change(u,u+v-1,0,1,n,1);
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: