CF_46D
由于数据范围很小,实际上可以直接暴力的。但为了练练线段树合并区间的操作所以就用线段树写了。
更多和线段树合并区间有关的题目可以参考胡浩的博客:http://www.notonlysuccess.com/index.php/segment-tree-complete/。
#include<stdio.h> #include<string.h> #define MAXD 100210 #define MAXQ 110 int N, L, B, F, lc[4 * MAXD], mc[4 * MAXD], rc[4 * MAXD], to[4 * MAXD]; struct Car { int x, y; }car[MAXQ]; void build(int cur, int x, int y) { int mid = (x + y) >> 1, ls = cur << 1, rs = (cur << 1) | 1; mc[cur] = lc[cur] = rc[cur] = y - x + 1; to[cur] = -1; if(x == y) return ; build(ls, x, mid); build(rs, mid + 1, y); } int getmax(int x, int y) { return x > y ? x : y; } void update(int cur, int x, int y) { int mid = (x + y) >> 1, ls = cur << 1, rs = (cur << 1) | 1; mc[cur] = getmax(mc[ls], mc[rs]); mc[cur] = getmax(rc[ls] + lc[rs], mc[cur]); lc[cur] = lc[ls] + (lc[ls] == mid - x + 1 ? lc[rs] : 0); rc[cur] = rc[rs] + (rc[rs] == y - mid ? rc[ls] : 0); } void pushdown(int cur, int x, int y) { int mid = (x + y) >> 1, ls = cur << 1, rs = (cur << 1) | 1; if(to[cur] != -1) { to[ls] = to[rs] = to[cur]; mc[ls] = lc[ls] = rc[ls] = (to[cur] ? 0 : mid - x + 1); mc[rs] = lc[rs] = rc[rs] = (to[cur] ? 0 : y - mid); to[cur] = -1; } } int query(int cur, int x, int y, int z) { int mid = (x + y) >> 1, ls = cur << 1, rs = (cur << 1) | 1; if(x == y) return x; pushdown(cur, x, y); if(mc[rs] >= z) return query(rs, mid + 1, y, z); else if(rc[ls] + lc[rs] >= z) return mid + lc[rs]; else return query(ls, x, mid, z); } void refresh(int cur, int x, int y, int s, int t, int c) { int mid = (x + y) >> 1, ls = cur << 1, rs = (cur << 1) | 1; if(x >= s && y <= t) { to[cur] = c; mc[cur] = lc[cur] = rc[cur] = (c ? 0 : y - x + 1); return ; } pushdown(cur, x, y); if(mid >= s) refresh(ls, x, mid, s, t, c); if(mid + 1 <= t) refresh(rs, mid + 1, y, s, t, c); update(cur, x, y); } void solve() { int i, j, k, x, y, n, len; scanf("%d", &n); for(i = 1; i <= n; i ++) { scanf("%d", &j); if(j == 1) { scanf("%d", &len); if(mc[1] < len + B + F) printf("-1\n"); else { y = query(1, 1, N, len + B + F); printf("%d\n", N - y); car[i].x = y - B - len + 1, car[i].y = y - B; refresh(1, 1, N, car[i].x, car[i].y, 1); } } else { scanf("%d", &k); refresh(1, 1, N, car[k].x, car[k].y, 0); } } } void init() { N = L + B + F; build(1, 1, N); } int main() { while(scanf("%d%d%d", &L, &B, &F) == 3) { init(); solve(); } return 0; }