• 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;
    }
  • 相关阅读:
    药方
    Git配置
    黄俊俊:做一个有想法的技术人
    刘铁猛:程序员:造阀门前,先蓄满‘情商池’
    Nginx + Tomcat 配置负载均衡集群简单实例
    mysql 用户权限管理详细
    mysql数据权限操作
    搭建分布式系统
    数据库 -- 悲观锁与乐观锁
    tomcat7以下线程控制
  • 原文地址:https://www.cnblogs.com/zjbztianya/p/3129308.html
Copyright © 2020-2023  润新知