codeforces 46D Parking Lot(线段树 区间合并)
2017-10-22 14:55
627 查看
附上题意:http://blog.csdn.net/cyhbyw/article/details/8793195
不知道怎么wa的,没找到错误,然后就把 poj 3667 Hotel的代码改了改就交了,A掉。。。
不知道怎么wa的,没找到错误,然后就把 poj 3667 Hotel的代码改了改就交了,A掉。。。
#include <cstdio> #include <cstring> #include <algorithm> #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 const int MAXN = 101000; int lsum[MAXN<<2],rsum[MAXN<<2],msum[MAXN<<2]; int cover[MAXN<<2]; void build(int l,int r, int rt) { lsum[rt] = rsum[rt] = msum[rt] = r-l+1; cover[rt] = -1; if(l == r) return; int m = (l+r)>>1; build(lson); build(rson); } void pushDown(int rt, int len) { if(cover[rt] != -1) { cover[rt<<1] = cover[rt<<1|1] = cover[rt]; lsum[rt<<1] = rsum[rt<<1] = msum[rt<<1] = cover[rt] ? 0: len-(len>>1); lsum[rt<<1|1] = rsum[rt<<1|1] = msum[rt<<1|1] = cover[rt] ? 0 : len>>1; cover[rt] = -1; } } void pushUp(int rt, int len) { lsum[rt] = lsum[rt<<1]; rsum[rt] = rsum[rt<<1|1]; if(lsum[rt<<1] == len-(len>>1)) lsum[rt] += lsum[rt<<1|1]; if(rsum[rt<<1|1] == (len>>1)) rsum[rt] += rsum[rt<<1]; msum[rt] = std::max(rsum[rt<<1]+lsum[rt<<1|1],std::max(msum[rt<<1],msum[rt<<1|1])); } int query(int l, int r, int rt, int len) { if(l == r) return l; pushDown(rt,r-l+1); int m = (l+r)>>1; if(msum[rt<<1] >= len) return query(lson,len); else if(rsum[rt<<1]+lsum[rt<<1|1] >= len) return m-rsum[rt<<1]+1; return query(rson,len); } void update(int L, int R, int c, int l, int r , int rt) { if(l >= L && r <= R) { lsum[rt] = msum[rt] = rsum[rt] = c ? 0:r-l+1; cover[rt] = c; return; } pushDown(rt,r-l+1); int m =(l+r)>>1; if(m >= L) update(L,R,c,lson); if(R > m) update(L,R,c,rson); pushUp(rt,r-l+1); } int start[110]; int len[110]; int main() { int n,b,f,q,op,x; scanf("%d %d %d",&n,&b,&f); build(1,b+n+f,1); scanf("%d",&q); for(int i = 1; i <= q; ++i) { scanf("%d %d",&op,&x); if(op == 1) { if(b+x+f > msum[1]) { puts("-1"); continue; } int pos = query(1,n+b+f,1,b+x+f); update(b+pos,b+pos+x-1,1,1,n+b+f,1); printf("%d\n",pos-1); start[i] = pos; len[i] = x; } else update(b+start[x],b+start[x]+len[x]-1,0,1,n+b+f,1); } }
相关文章推荐
- CodeForces 46D Parking Lot(线段树区间合并)
- CodeForces 46D Parking Lot (线段树区间合并)
- CodeForces - 145E - Lucky Queries(线段树[区间合并])
- Codeforces 527C Glass Carving 线段树区间合并
- codeforces 46D 线段树 区间合并
- [Codeforces 712E Memory and Casinos]概率+线段树区间合并
- codeforces 46D Parking Lot(线段树模拟区间管理 or set模拟)
- codeforces 46D 线段树区间合并
- codeforces 150C Smart Cheater 线段树区间合并
- 【CodeForce】 46D Parking Lot (线段树 区间合并)
- PKU 3667 Hotel (线段树,区间合并,最长连续区间)
- HDU3397:Sequence operation(线段树区间合并)
- 线段树区间合并——POJ 3667
- 线段树的区间更新区间合并
- [树上LIS 线段树合并] Codeforces 490F #279 (Div. 2) F. Treeland Tour
- hdoj 3911 Black And White 【线段树区间异或 + 合并】
- poj(3667)——hotel(线段树区间合并)
- HDU 3397 线段树区间合并
- Codeforces 719E [斐波那契区间操作][矩阵快速幂][线段树区间更新]
- HDU 2871 Memory Control(线段树+区间合并+vector)