poj3667 线段树+区间合并
2013-07-27 15:58
543 查看
第一道额~~
#include <iostream> #include <cstring> #include <cstdio> using namespace std; const int MAXN=100005; struct node { int l,r; int lsum,rsum,msum; int mid() { return (l+r)>>1; } }; node tree[MAXN*4]; inline void pushup(int pos) { tree[pos].msum=max(tree[pos<<1].msum,tree[pos<<1|1].msum); tree[pos].msum=max(tree[pos].msum,tree[pos<<1].rsum+tree[pos<<1|1].lsum); if(tree[pos<<1].lsum==tree[pos<<1].r-tree[pos<<1].l+1) tree[pos].lsum=tree[pos<<1].lsum+tree[pos<<1|1].lsum; else tree[pos].lsum=tree[pos<<1].lsum; if(tree[pos<<1|1].rsum==tree[pos<<1|1].r-tree[pos<<1|1].l+1) tree[pos].rsum=tree[pos<<1|1].rsum+tree[pos<<1].rsum; else tree[pos].rsum=tree[pos<<1|1].rsum; } inline void pushdown(int pos) { if(tree[pos].msum==tree[pos].r-tree[pos].l+1) { tree[pos<<1].msum=tree[pos<<1].lsum=tree[pos<<1].rsum=tree[pos<<1].r-tree[pos<<1].l+1; tree[pos<<1|1].msum=tree[pos<<1|1].lsum=tree[pos<<1|1].rsum=tree[pos<<1|1].r-tree[pos<<1|1].l+1; } else if(tree[pos].msum==0) { tree[pos<<1].msum=tree[pos<<1].lsum=tree[pos<<1].rsum=0; tree[pos<<1|1].msum=tree[pos<<1|1].lsum=tree[pos<<1|1].rsum=0; } } void build(int l,int r,int pos) { tree[pos].l=l; tree[pos].r=r; if(l==r) { tree[pos].msum=tree[pos].lsum=tree[pos].rsum=1; return ; } int mid=tree[pos].mid(); build(l,mid,pos<<1); build(mid+1,r,pos<<1|1); pushup(pos); } void update(int l,int r,int x,int pos) { if(tree[pos].l==l&&tree[pos].r==r) { if(x==0) tree[pos].msum=tree[pos].lsum=tree[pos].rsum= tree[pos].r-tree[pos].l+1; else tree[pos].msum=tree[pos].lsum=tree[pos].rsum=0; return ; } pushdown(pos); int mid=tree[pos].mid(); if(r<=mid) update(l,r,x,pos<<1); else if(l>mid) update(l,r,x,pos<<1|1); else { update(l,mid,x,pos<<1); update(mid+1,r,x,pos<<1|1); } pushup(pos); } int query(int x,int pos) { if(tree[pos].msum<x) return 0; if(tree[pos].l==tree[pos].r) { return tree[pos].l; } if(tree[pos].lsum>=x) return tree[pos].l; pushdown(pos); if(tree[pos<<1].msum>=x) return query(x,pos<<1); else if(tree[pos<<1].rsum+tree[pos<<1|1].lsum>=x) { return tree[pos<<1].r-tree[pos<<1].rsum+1; } else return query(x,pos<<1|1); } int main() { int n,m; scanf("%d%d",&n,&m); build(1,n,1); int i; for(i=0;i<m;i++) { int k,a,b; scanf("%d",&k); if(k==1) { scanf("%d",&a); int x=query(a,1); if(x!=0) update(x,x+a-1,1,1); printf("%d\n",x); } else { scanf("%d%d",&a,&b); update(a,a+b-1,0,1); } } return 0; }
相关文章推荐
- poj3667(线段树区间合并)
- poj3667 线段树区间合并
- 线段树区间合并poj3667
- poj3667(线段树,区间合并)
- poj3667(线段树区间合并)
- POJ3667-Hotel-线段树区间合并(模板)
- 线段树 区间更新(hdu1698) 区间合并(poj3667)
- POJ3667(线段树区间合并)
- poj3667 Hotel (线段树--区间合并)转自网络【2】
- poj3667 线段树(区间合并)
- [POJ3667]Hotel(线段树,区间合并)
- POJ3667——线段树区间合并(未搞透)——Hotel
- poj3667(线段树区间合并&区间查询)
- poj3667 Hotel 线段树延迟更新 区间合并
- poj3667(线段树区间合并)
- poj3667 Hotel (线段树区间合并)
- poj3667 hotel(线段树区间合并)
- poj3667 (线段树区间合并)
- poj3667-Hotel 线段树区间合并
- poj3667 Hotel 线段树 区间合并