Codeforces46D - Parking Lot(区间合并)

题目大意

有一个长为L的街道可用来停车,司机在寻找停车位的时候,要求与后车的车距不少于b,与前车的距离不少于f。总共有两种操作,第一种操作是查询是否有可以停车的空位,如果有多个空位可以选择的话,选择最靠左的空位停车,并返回它的左端位置。第二种操作是让第x次操作的车从所占的车位开走。

题解

POJ3677Hotel差不多,都是寻找连续的空位。不过要注意第一辆车是不需要考虑前方车距的,最后一辆车不需要后方车距。我们可以把街道长度扩充为L+ b+f即可,假设车长为x,那么每次查询长度大于等于x+b+f的空位就OK了。

代码:

#include<iostream>

#include<cstdio>

#include<algorithm>

using namespace std;

#define lson l,m,s<<1

#define rson m+1,r,s<<1|1

#define MAXN 110000

typedef struct {

        int l;

        int r;

} NODE;

int msum[MAXN<<2],rsum[MAXN<<2],lsum[MAXN<<2],setv[MAXN<<2];

NODE t[MAXN];

void PushUp(int s,int m)

{

        msum[s]=max(max(msum[s<<1],msum[s<<1|1]),rsum[s<<1]+lsum[s<<1|1]);

        lsum[s]=lsum[s<<1];

        rsum[s]=rsum[s<<1|1];

        if(lsum[s<<1]==(m-(m>>1))) lsum[s]+=lsum[s<<1|1];

        if(rsum[s<<1|1]==(m>>1)) rsum[s]+=rsum[s<<1];

}

void PushDown(int s,int m)

{

        if(setv[s]!=-1) {

                setv[s<<1]=setv[s<<1|1]=setv[s];

                lsum[s<<1]=rsum[s<<1]=msum[s<<1]=setv[s]*(m-(m>>1));

                lsum[s<<1|1]=rsum[s<<1|1]=msum[s<<1|1]=setv[s]*(m>>1);

                setv[s]=-1;

        }

}

void build(int l,int r,int s)

{

        setv[s]=-1;

        msum[s]=lsum[s]=rsum[s]=r-l+1;

        if(l==r) return;

        int m=(l+r)>>1;

        build(lson);

        build(rson);

}

void update(int ql,int qr,int d,int l,int r,int s)

{

        if(ql<=l&&r<=qr) {

                setv[s]=d;

                msum[s]=lsum[s]=rsum[s]=d*(r-l+1);

                return;

        }

        PushDown(s,r-l+1);

        int m=(l+r)>>1;

        if(ql<=m) update(ql,qr,d,lson);

        if(qr>m) update(ql,qr,d,rson);

        PushUp(s,r-l+1);

}

int query(int w,int l,int r,int s )

{

        if(l==r) return l;

        PushDown(s,r-l+1);

        int m=(l+r)>>1;

        if(msum[s<<1]>=w) return query(w,lson);

        else if(rsum[s<<1]+lsum[s<<1|1]>=w) return m-rsum[s<<1]+1;

        else

                return query(w,rson);

}

int main(void)

{

        int l,b,f,a,x,pos,m,p=0;

        while(scanf("%d%d%d",&l,&b,&f)!=EOF) {

                l=l+b+f-1;

                build(0,l,1);

                scanf("%d",&m);

                while(m--) {

                        ++p;

                        scanf("%d%d",&a,&x);

                        if(a==1) {

                                if(msum[1]<x+b+f) printf("-1\n");

                                else {

                                        pos=query(x+b+f,0,l,1);

                                        printf("%d\n",pos);

                                        t[p].l=pos+b;

                                        t[p].r=pos+x+b-1;

                                        update(t[p].l,t[p].r,0,0,l,1);

                                }

                        } else

                                update(t[x].l,t[x].r,1,0,l,1);

                }

        }

        return 0;

}

再贴上大神的代码以供膜拜。。。容器果然是个好东西。。。。

#include <cstdio>

#include <vector>

#include <utility>

#include <algorithm>

using namespace std;

const int INF = 1000000000;

int main()

{

        int L, B, F, n, a[128], b[128];

        pair<int, int> p[128];

        vector<pair<int, int> > v;

        scanf("%d%d%d", &L, &F, &B);

        v.push_back(make_pair(-INF, -F));

        v.push_back(make_pair(L + B, INF));

        scanf("%d", &n);

        for (int i = 1; i <= n; ++i) {

                scanf("%d%d", &a[i], &b[i]);

                if (a[i] == 2) {

                        v.erase(find(v.begin(), v.end(), p[b[i]]));

                } else {

                        p[i].first = -1;

                        for (int j = 1; j < (int)v.size(); ++j) {

                                if (v[j - 1].second + F + b[i] + B <= v[j].first) {

                                        p[i] = make_pair(v[j - 1].second + F, v[j - 1].second + F + b[i]);

                                        v.push_back(p[i]);

                                        sort(v.begin(), v.end());

                                        break;

                                }

                        }

                        printf("%d\n", p[i].first);

                }

        }

        return 0;

}

你可能感兴趣的:(codeforces)