Codeforces46D(Parking Lot)線段樹區間查詢

來源:互聯網
上載者:User
/***********************************************題目地址:http://codeforces.com/problemset/problem/46/D題目大意:有一條長度為L的街道,有N個操作,操作有兩種:(1)"1 a",表示有一輛長度為a的車開進來想找停車位;停車位必須滿足與它前面的車距離至少為b,與後面的車距離至少為f;如果能找到這樣的停車位;輸出這輛車的起始位置(且這個位置最小),否則輸出-1;(2)"2 a",表示第a個事件裡進來停車的那輛車開出去了;演算法思想:建立起點為-b,終點為L+f的線段樹;尋找的時候,直接尋找len+b+f的線段樹就可以了;其他地方類似於pku3667;線段樹的更新要用延遲更新;在區間查詢和更新的時候加入一個延遲節點;每次要在下次查詢或者更新到該區間時;再把節點的資訊傳遞到左右孩子的結點上;這樣更新大大減少了時間和空間上的開銷;************************************************/#include<iostream>#include<cstring>#include<cstdlib>#include<cstdio>#include<climits>#include<algorithm>using namespace std;#define L l,m,u<<1#define R m+1,r,u<<1|1const int N =100010;struct darling{    int t,l;} s[N];struct car{    int ls,rs,ms;    int flag;} a[N*4];void PushUp(int u,int m)//把當前結點的資訊更新到父結點{    a[u].ls=a[u<<1].ls;    a[u].rs=a[u<<1|1].rs;    if(a[u].ls==m-(m>>1))        a[u].ls+=a[u<<1|1].ls;    if(a[u].rs==(m>>1))        a[u].rs+=a[u<<1].rs;    a[u].ms=max(a[u<<1|1].ls+a[u<<1].rs,max(a[u<<1].ms,a[u<<1|1].ms));}void PushDown(int u,int m)//把當前結點的資訊更新給兒子結點{    if (a[u].flag!=-1)    {        a[u<<1].flag=a[u<<1|1].flag=a[u].flag;        a[u<<1].ms=a[u<<1].ls=a[u<<1].rs=a[u].flag?0:m-(m>>1);        a[u<<1|1].ms=a[u<<1|1].ls=a[u<<1|1].rs=a[u].flag?0:(m>>1);        a[u].flag=-1;    }}void build(int l,int r,int u){    a[u].ms=a[u].ls=a[u].rs=r-l+1;    a[u].flag=-1;    if(l==r)        return;    int m=(l+r)>>1;    build(L);    build(R);}void update(int l1,int r1,int c,int l,int r,int u)//區間替換{    if(l1<=l&&r<=r1)    {        a[u].ms=a[u].ls=a[u].rs=c?0:r-l+1;        a[u].flag=c;        return;    }    PushDown(u,r-l+1);    int m=(l+r)>>1;    if(l1<=m)        update(l1,r1,c,L);    if(m<r1)        update(l1,r1,c,R);    PushUp(u,r-l+1);}int query(int w,int l,int r,int u)//查詢滿足條件的最左端點{    if(l==r)        return l;    PushDown(u,r-l+1);    int m=(l+r)>>1;    if(a[u<<1].ms>=w)//左兒子的ms值大於等於x,則到左兒子裡去找;        return query(w,L);    else if(a[u<<1].rs+a[u<<1|1].ls>=w)//如果左兒子的rs加上右兒子的ls大於等於x,則直接返回左兒子的右端點減去左兒子的rs值;        return m-a[u<<1].rs+1;    return query(w,R);//否則到右兒子裡去找;}int main(){   //freopen("C:\\Users\\Administrator\\Desktop\\kd.txt","r",stdin);    int L1,b,f;    while(~scanf("%d%d%d",&L1,&b,&f))    {        build(-b,L1+f,1);        int n;        scanf("%d",&n);        for(int i=1;i<=n;i++)        {            int op,x;            scanf("%d%d",&op,&x);            if(op==1)            {                s[i].l=x;                if(a[1].ms<x+b+f+1)                {                    puts("-1");                    s[i].t=-1;                }                else                {                    int p=query(x+b+f,-b,L1+f,1);                    printf("%d\n",p+b);                    s[i].t=p+b;                    s[i].l=x;                    update(p+b,p+b+x-1,1,-b,L1+f,1);                }            }            else            {                s[i].t=-1;                update(s[x].t,s[x].t+s[x].l-1,0,-b,L1+f,1);            }        }    }    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.