zoukankan      html  css  js  c++  java
  • 【线段树区间合并】BZOJ1593-[Usaco2008 Feb]Hotel 旅馆

    好无聊,以前写过没什么好讲的,水过。

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstdlib>
      4 #define lson l,mid,rt<<1
      5 #define rson mid+1,r,rt<<1|1
      6 #define root 1
      7 using namespace std;
      8 const int MAXN=50000+50;
      9 int n,m;
     10 int lsum[MAXN<<2],rsum[MAXN<<2],msum[MAXN<<2];
     11 int cover[MAXN<<2];//区间覆盖 
     12 
     13 void pushdown(int l,int r,int rt)
     14 {
     15     int mid=(l+r)>>1;
     16     if (cover[rt]!=-1)
     17     {
     18         cover[rt<<1]=cover[rt<<1|1]=cover[rt];
     19         if (cover[rt]==1)
     20             lsum[rt<<1]=lsum[rt<<1|1]=rsum[rt<<1]=rsum[rt<<1|1]=msum[rt<<1]=msum[rt<<1|1]=0;
     21         else
     22         {
     23             lsum[rt<<1]=rsum[rt<<1]=msum[rt<<1]=mid-l+1;
     24             lsum[rt<<1|1]=rsum[rt<<1|1]=msum[rt<<1|1]=r-mid;
     25         }
     26         cover[rt]=-1;
     27     }
     28 }
     29 
     30 void pushup(int l,int r,int rt)
     31 {
     32     int mid=(l+r)>>1;
     33     lsum[rt]=lsum[rt<<1];
     34     if (lsum[rt<<1]==(mid-l+1)) lsum[rt]+=lsum[rt<<1|1];
     35     rsum[rt]=rsum[rt<<1|1];
     36     if (rsum[rt<<1|1]==(r-mid)) rsum[rt]+=rsum[rt<<1];
     37     msum[rt]=max(rsum[rt<<1]+lsum[rt<<1|1],max(msum[rt<<1],msum[rt<<1|1]));
     38 }
     39 
     40 void update(int L,int R,int c,int l,int r,int rt)
     41 {
     42     if (L<=l && r<=R)
     43     {
     44         msum[rt]=lsum[rt]=rsum[rt]=c? 0:(r-l+1);
     45         cover[rt]=c;
     46         return;    
     47     }
     48     pushdown(l,r,rt);
     49     int mid=(l+r)>>1;
     50     if (L<=mid) update(L,R,c,lson);
     51     if (mid<R) update(L,R,c,rson);
     52     pushup(l,r,rt);    
     53 }
     54 
     55 int query(int q,int l,int r,int rt)
     56 {
     57     if (l==r) return l;
     58     pushdown(l,r,rt);
     59     int mid=(l+r)>>1;
     60     if (msum[rt<<1]>=q) return(query(q,lson));
     61     if (rsum[rt<<1]+lsum[rt<<1|1]>=q) return(mid-rsum[rt<<1]+1);
     62     return (query(q,rson));
     63 }
     64 
     65 void build(int l,int r,int rt)
     66 {
     67     lsum[rt]=rsum[rt]=msum[rt]=r-l+1;
     68     cover[rt]=-1;
     69     if (l==r) return;
     70     int mid=(l+r)>>1;
     71     build(lson);
     72     build(rson);
     73 }
     74 
     75 void solve()
     76 {
     77     build(1,n,1); 
     78     for (int i=0;i<m;i++)
     79     {
     80         int op,d,x;
     81         scanf("%d",&op);
     82         if (op==1)
     83         {
     84             scanf("%d",&d);
     85             if (msum[root]<d) puts("0");
     86             else
     87             {
     88                 x=query(d,1,n,1);
     89                 printf("%d
    ",x);
     90                 update(x,x+d-1,1,1,n,1);
     91             }
     92         }
     93         else 
     94         {
     95             scanf("%d%d",&x,&d);
     96             update(x,x+d-1,0,1,n,1);
     97         }
     98     }
     99 }
    100 
    101 int main()
    102 {
    103     scanf("%d%d",&n,&m);
    104     solve();
    105     return 0;
    106 }
  • 相关阅读:
    ip代理投票
    linq小笔记;
    c#类的执行顺序
    IEnumerable、GetEnumerator、IEnumerator的理解
    English随笔1
    AudioServicesPlaySystemSound音频服务—IOS开发
    iOS开发之压缩与解压文件
    xcode添加Cocos2d
    使用CoreTelephony获得SIM卡网络运营商名称
    iOS设备进行定位?
  • 原文地址:https://www.cnblogs.com/iiyiyi/p/5734539.html
Copyright © 2011-2022 走看看