poj 3667 线段树合并区间
2013-03-20 13:01
351 查看
经典问题,每个节点记录最大连续长度,从最左边开始最大连续长度与从右边开始的最大连续长度,和一个cov,0表示全未被覆盖,1表示全被覆盖,2表示部分被覆盖。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn=50005; int N,M; struct Tree { int l,r; int rcov,lcov,clen,cov,lazy; int len() { return r-l+1; } }t[maxn<<2]; #define mid ((t[p].l+t[p].r)>>1) #define ls (p<<1) #define rs ((ls)+1) void maketree(int p,int l,int r) { t[p].l=l;t[p].r=r;t[p].cov=0;t[p].lazy=-1; t[p].lcov=t[p].rcov=t[p].clen=t[p].len(); if(l==r) return; maketree(ls,l,mid); maketree(rs,mid+1,r); } void pushup(int p) { if(t[ls].cov!=t[rs].cov) t[p].cov=2; else t[p].cov=t[ls].cov; } void update(int p) { if(t[p].cov==0) t[p].clen=t[p].lcov=t[p].rcov=t[p].len(); else if(t[p].cov==1) t[p].clen=t[p].lcov=t[p].rcov=0; else { int lc=t[ls].lcov,rc=t[rs].rcov; t[p].lcov=(lc==t[ls].len()?lc+t[rs].lcov:lc); t[p].rcov=(rc==t[rs].len()?rc+t[ls].rcov:rc); t[p].clen=max(max(t[ls].clen,t[rs].clen),t[ls].rcov+t[rs].lcov); } } void pushdown(int p) { if(t[p].lazy!=-1) { int f=t[p].lazy; t[ls].lazy=f; t[rs].lazy=f; t[ls].cov=f; t[rs].cov=f; t[p].lazy=-1; update(ls);update(rs); } } void insert(int p,int l,int r,int f) { if(t[p].l==l&&t[p].r==r) { t[p].cov=f;t[p].lazy=f; update(p); return ; } pushdown(p); if(r<=mid) insert(ls,l,r,f); else if(l>=mid+1) insert(rs,l,r,f); else { insert(ls,l,mid,f); insert(rs,mid+1,r,f); } pushup(p); update(p); } int query(int p,int cnt) { if(t[p].clen<cnt) return 0; if(t[p].l==t[p].r) return t[p].l; pushdown(p); if(t[ls].clen>=cnt) return query(ls,cnt); else if(t[ls].rcov+t[rs].lcov>=cnt) return t[ls].r-t[ls].rcov+1; else if(t[rs].clen>=cnt) return query(rs,cnt); return 0; } int main() { // freopen("test.txt","r",stdin); scanf("%d%d",&N,&M); maketree(1,1,N); for(int i=0;i<M;i++) { int ty,a,b; scanf("%d",&ty); if(ty==1) { scanf("%d",&a); int x=query(1,a); printf("%d\n",x); if(x) insert(1,x,x+a-1,1); } else { scanf("%d%d",&a,&b); insert(1,a,a+b-1,0); } } return 0; }
相关文章推荐
- POJ 3667 Hotel 线段树区间合并
- POJ 3667 Hotel(线段树区间合并)
- POJ 3667 Hotel 线段树区间合并
- POJ 3667 Hotel (线段树区间合并)
- 线段树(区间合并) POJ 3667 Hotel
- POJ 3667(线段树区间合并)
- poj 3667 Hotel 【线段树区间合并】
- POJ 3667 区间合并段查询段修改 中级线段树
- poj 3667 Hotel(线段树,成段更新,区间合并,Lazy思想)
- 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 区间合并