poj 3667 Hotel 区间合并
来源:互联网 发布:博易大师软件 编辑:程序博客网 时间:2024/05/21 22:57
1 a:询问有没有连续长度为a的空位置,插进最左边
2 a b :【a,a+b-1】区间清空
结点记录的信息:
1:区间内最长的连续空位(msum)
2:从当前区间的最左端开始的连续空位长度(lsum)
3:从当前区间的最右端开始的连续空位长度(往左边数)(rsum)
区间的最值就是max(左右子节点最长连续空位的最大值,lsum【rt<<1|1】+rsum[rt<<1])
其他就基本上和一般的成段更新,懒惰标记没什么区别了
View Code
#include<cstdio>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define max(a,b) (a)>(b)?(a):(b)
const int maxn = 50010;
int msum[maxn<<2],lsum[maxn<<2],rsum[maxn<<2],col[maxn<<2];
void pushdown(int rt,int m){
if(col[rt]!=-1){
col[rt<<1]=col[rt<<1|1]=col[rt];
msum[rt<<1]=lsum[rt<<1]=rsum[rt<<1]=col[rt] ? 0:m-(m>>1);
msum[rt<<1|1]=lsum[rt<<1|1]=rsum[rt<<1|1]=col[rt] ? 0 : (m>>1);
col[rt]=-1;
}
}
void pushup(int rt,int m){
lsum[rt]=lsum[rt<<1];
rsum[rt]=rsum[rt<<1|1];
if(lsum[rt]==m-(m>>1)) lsum[rt]+=lsum[rt<<1|1];
if(rsum[rt]==(m>>1)) rsum[rt]+=rsum[rt<<1];
msum[rt]=max(lsum[rt<<1|1]+rsum[rt<<1],max(msum[rt<<1],msum[rt<<1|1]));
}
void build(int l,int r,int rt){
msum[rt]=lsum[rt]=rsum[rt]=r-l+1;
col[rt]=-1;
if(l==r) return ;
int m=(l+r)>>1;
build(lson);
build(rson);
}
void update(int L,int R,int c,int l,int r,int rt){
if(L<=l&&r<=R){
msum[rt]=lsum[rt]=rsum[rt] = c ? 0 : r-l+1;
col[rt]=c;
return ;
}
pushdown(rt,r-l+1);
int m=(l+r)>>1;
if(L<=m) update(L,R,c,lson);
if(R>m) update(L,R,c,rson);
pushup(rt,r-l+1);
}
int query(int len,int l,int r,int rt){
if(l==r) return l;
pushdown(rt,r-l+1);
int m=(l+r)>>1;
if(msum[rt<<1]>=len) return query(len,lson);
else if(lsum[rt<<1|1]+rsum[rt<<1]>=len) return m-rsum[rt<<1]+1;
else return query(len,rson);
}
int main(){
int n,m,flag,a,b,c;
while(scanf("%d%d",&n,&m)!=EOF){
build(1,n,1);
while(m--){
scanf("%d",&flag);
if(flag==1){
scanf("%d",&a);
if(msum[1]<a) printf("0\n");
else {
int id=query(a,1,n,1);printf("%d\n",id);
update(id,id+a-1,1,1,n,1);
}
}
else {
scanf("%d%d",&a,&b);
update(a,a+b-1,0,1,n,1);
}
}
}
return 0;
}
- poj 3667 Hotel 区间合并
- POJ 3667 Hotel 区间合并
- poj 3667 Hotel 区间合并
- 区间合并 POJ 3667 Hotel
- POJ 3667 Hotel 区间合并+区间更新
- POJ 3667 Hotel 线段树区间合并
- poj 3667 Hotel 线段树区间合并
- POJ 3667 Hotel 线段树 区间合并
- Poj 3667 Hotel 线段树 区间合并
- POJ 3667-hotel(线段树区间合并)
- POJ 3667 Hotel. (线段树 区间合并)
- 【线段树】POJ 3667 Hotel 区间合并
- POJ 3667 Hotel ( 线段树区间合并 )
- 线段树 区间合并 poj 3667 Hotel
- POJ 3667 Hotel 线段树 区间合并
- POJ - 3667 Hotel (线段树 + 区间合并)
- poj 3667 Hotel(区间合并)
- POJ 3667 Hotel 【线段树 区间合并】
- poj 2182 lost cows 树状数组,二分
- hdu 4031 attack 树状数组 线段树 两种做法
- hdu 3460 Ancient Printer
- hdu 4107 Gangster 线段树 成段更新
- hdu 2227 Find the nondecreasing subsequences 树状数组+简单DP
- poj 3667 Hotel 区间合并
- hdu 2757 广搜+优先队列
- hdu 1542 线段树 求面积并
- hdu 1225 求覆盖至少两次的区域的面积并
- hdu 1828 poj 1177 picture 求周长并
- poj 2677 双调欧几里得 动态规划
- 线段树 hdu 2871 memory control
- hdu 3016 man down
- hdu 3030 树状数组 简单 DP