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];

    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;

}

你可能感兴趣的:(in)