CF 46D Parking Lot
生活随笔
收集整理的這篇文章主要介紹了
CF 46D Parking Lot
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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];elsereturn 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; }轉載于:https://www.cnblogs.com/staginner/archive/2012/04/17/2454096.html
總結
以上是生活随笔為你收集整理的CF 46D Parking Lot的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 专利学习笔记5:CPC客户端的安装方法
- 下一篇: CPC客户端从写作到提交成功的巨坑