codeforces 46D 线段树区间合并
2014-09-10 23:09
302 查看
题意:
思路:这题难在边界的处理。。表示自己弱爆了。。后来看了别人的思路瞬间觉得好巧。。就是在区间[0,L - 1]左端加一个长度
为b的区间,在区间右端加一个长度为 f 的区间,然后进行区间合并就好。详见代码:
思路:这题难在边界的处理。。表示自己弱爆了。。后来看了别人的思路瞬间觉得好巧。。就是在区间[0,L - 1]左端加一个长度
为b的区间,在区间右端加一个长度为 f 的区间,然后进行区间合并就好。详见代码:
// file name: codeforces46D.cpp // // author: kereo // // create time: 2014年09月10日 星期三 14时39分47秒 // //***********************************// #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<set> #include<map> #include<vector> #include<stack> #include<cmath> #include<string> #include<algorithm> using namespace std; typedef long long ll; const int MAXN=100000+100; const int inf=0x3fffffff; const int mod=1000000000+7; #define L(x) (x<<1) #define R(x) (x<<1|1) int n,m,b,f; struct Query { int l,r; }q[MAXN]; struct node { int l,r,c; int ls,rs,len; }segtree[MAXN<<2]; void push_down(int rt){ if(segtree[rt].c!=-1){ segtree[L(rt)].c=segtree[R(rt)].c=segtree[rt].c; segtree[L(rt)].ls=segtree[L(rt)].rs=segtree[L(rt)].len=segtree[rt].c ? 0 : segtree[L(rt)].r-segtree[L(rt)].l+1; segtree[R(rt)].ls=segtree[R(rt)].rs=segtree[R(rt)].len=segtree[rt].c ? 0 : segtree[R(rt)].r-segtree[R(rt)].l+1; segtree[rt].c=-1; } } void push_up(int rt){ segtree[rt].ls=segtree[L(rt)].ls; segtree[rt].rs=segtree[R(rt)].rs; segtree[rt].len=max(segtree[L(rt)].len,segtree[R(rt)].len); if(segtree[L(rt)].ls == segtree[L(rt)].r-segtree[L(rt)].l+1) segtree[rt].ls+=segtree[R(rt)].ls; if(segtree[R(rt)].rs == segtree[R(rt)].r-segtree[R(rt)].l+1) segtree[rt].rs+=segtree[L(rt)].rs; segtree[rt].len=max(segtree[rt].len,segtree[L(rt)].rs+segtree[R(rt)].ls); } void build(int rt,int l,int r){ segtree[rt].l=l; segtree[rt].r=r; segtree[rt].c=-1; segtree[rt].ls=segtree[rt].rs=segtree[rt].len=r-l+1; if(l == r) return ; int mid=(l+r)>>1; build(L(rt),l,mid); build(R(rt),mid+1,r); } void update(int rt,int l,int r,int c){ if(segtree[rt].l == l && segtree[rt].r == r){ segtree[rt].c=c; segtree[rt].ls=segtree[rt].rs=segtree[rt].len=c ? 0 : r-l+1; return ; } push_down(rt); int mid=(segtree[rt].l+segtree[rt].r)>>1; if(l>mid) update(R(rt),l,r,c); else if(r<=mid) update(L(rt),l,r,c); else{ update(L(rt),l,mid,c); update(R(rt),mid+1,r,c); } push_up(rt); } int query(int rt,int len){ if(segtree[rt].len<len) return -1; if(segtree[rt].l == segtree[rt].r) return segtree[rt].l; push_down(rt); int mid=(segtree[rt].l+segtree[rt].r)>>1; if(segtree[L(rt)].len>=len) return query(L(rt),len); else if(segtree[L(rt)].rs+segtree[R(rt)].ls>=len) return mid-segtree[L(rt)].rs+1; else return query(R(rt),len); } int main() { while(~scanf("%d%d%d",&n,&b,&f)){ n+=b+f-1; build(1,0,n); scanf("%d",&m); for(int i=1;i<=m;i++){ int cmd,x; scanf("%d%d",&cmd,&x); if(cmd == 1){ int ans=query(1,x+b+f); if(ans == -1) printf("-1\n"); else{ printf("%d\n",ans); q[i].l=ans+b; q[i].r=ans+b+x-1; update(1,q[i].l,q[i].r,1); } } else update(1,q[x].l,q[x].r,0); } } return 0; }
相关文章推荐
- codeforces 46D 线段树 区间合并
- CodeForces - 145E - Lucky Queries(线段树[区间合并])
- CF-46D-Parking Lot(线段树,区间合并,点表示线段)
- CodeForces 46D Parking Lot (线段树区间合并)
- Codeforces 527C Glass Carving 线段树区间合并
- codeforces 150C Smart Cheater 线段树区间合并
- CodeForces 46D Parking Lot(线段树区间合并)
- [Codeforces 712E Memory and Casinos]概率+线段树区间合并
- codeforces 46D Parking Lot(线段树 区间合并)
- HDOJ 3308 LCIS (线段树之区间合并)
- 【bzoj4811】[Ynoi2017]由乃的OJ 树链剖分+线段树区间合并
- hdu 1199 Color the Ball (线段树区间合并,离散化)
- 【线段树】POJ 3667 Hotel 区间合并
- hdu 4453 约会安排(线段树区间合并)
- Codeforces 444C DZY Loves Colors 线段树区间更新
- HDU 3308 LCIS(线段树区间合并)
- 【POJ】 3667 hotel (线段树-区间合并)
- 【Hdu】1540 Tunnel Warfare(线段树|区间合并)
- POJ-3667 线段树(区间合并)
- 九度OJ 题目1496:数列区间 (线段树 区间合并 +成段更新)