• 【POJ】3667 Hotel


      1 #include<cstdio>
      2 #define MAX(a,b) ((a)>(b)?(a):(b))
      3 #define MAXN 50010
      4 struct node
      5 {
      6     int right,left,val;
      7 };
      8 node tree[MAXN<<2];
      9 int lazy[MAXN<<2];
     10 void Build(int L,int R,int rt)
     11 {
     12     lazy[rt]=-1;
     13     tree[rt].left=tree[rt].right=tree[rt].val=R-L+1;
     14     if(L!=R)
     15     {
     16         int mid=(L+R)>>1;
     17         Build(L,mid,rt<<1);
     18         Build(mid+1,R,rt<<1|1);
     19     }
     20 }
     21 inline void PushDown(int mid,int L,int R,int rt)
     22 {
     23     if(lazy[rt]!=-1)
     24     {
     25         lazy[rt<<1]=lazy[rt<<1|1]=lazy[rt];
     26         lazy[rt]^=1;
     27         tree[rt<<1].left=tree[rt<<1].right=tree[rt<<1].val=(mid-L+1)*lazy[rt];
     28         tree[rt<<1|1].left=tree[rt<<1|1].right=tree[rt<<1|1].val=(R-mid)*lazy[rt];
     29         lazy[rt]=-1;
     30     }
     31 }
     32 int Query(int x,int L,int R,int rt)
     33 {
     34     if(L==R)
     35         return L;
     36     int mid=(L+R)>>1;
     37     PushDown(mid,L,R,rt);
     38     if(tree[rt<<1].val>=x)
     39         return Query(x,L,mid,rt<<1);
     40     else if(tree[rt<<1].right+tree[rt<<1|1].left>=x)
     41         return mid-tree[rt<<1].right+1;
     42     else
     43         return Query(x,mid+1,R,rt<<1|1);
     44 }
     45 inline void PushUp(int mid,int L,int R,int rt)
     46 {
     47     tree[rt].left=tree[rt<<1].left;
     48     tree[rt].right=tree[rt<<1|1].right;
     49     if(tree[rt].left==mid-L+1)
     50         tree[rt].left+=tree[rt<<1|1].left;
     51     if(tree[rt].right==R-mid)
     52         tree[rt].right+=tree[rt<<1].right;
     53     tree[rt].val=MAX(tree[rt<<1].val,tree[rt<<1|1].val);
     54     tree[rt].val=MAX(tree[rt].val,tree[rt<<1].right+tree[rt<<1|1].left);
     55 }
     56 void Update(int x,int y,int val,int L,int R,int rt)
     57 {
     58     if(x<=L&&R<=y)
     59     {
     60         lazy[rt]=val;
     61         tree[rt].left=tree[rt].right=tree[rt].val=(R-L+1)*(val^1);
     62     }
     63     else
     64     {
     65         int mid=(L+R)>>1;
     66         PushDown(mid,L,R,rt);
     67         if(mid>=x)
     68             Update(x,y,val,L,mid,rt<<1);
     69         if(y>mid)
     70             Update(x,y,val,mid+1,R,rt<<1|1);
     71         PushUp(mid,L,R,rt);
     72     }
     73 }
     74 int main()
     75 {
     76     int n,m,type,x,y;
     77     while(~scanf("%d%d",&n,&m))
     78     {
     79         Build(1,n,1);
     80         while(m--)
     81         {
     82             scanf("%d%d",&type,&x);
     83             if(type==1)
     84             {
     85                 if(tree[1].val<x)
     86                     puts("0");
     87                 else
     88                 {
     89                     y=Query(x,1,n,1);
     90                     printf("%d\n",y);
     91                     Update(y,y+x-1,1,1,n,1);
     92                 }
     93             }
     94             else
     95             {
     96                 scanf("%d",&y);
     97                 Update(x,x+y-1,0,1,n,1);
     98             }
     99         }
    100     }
    101     return 0;
    102 }
    新博客:www.zhixiangli.com
  • 相关阅读:
    C#-获取页面源代码
    C#-获取页面源代码
    C#-窗体移动
    C#-窗体移动
    C#-窗体鼠标穿透
    C#-窗体鼠标穿透
    C#-string生成图片
    C#-string生成图片
    C#-Stmp发邮件
    POJ-1611 The Suspects
  • 原文地址:https://www.cnblogs.com/DrunBee/p/2514403.html
Copyright © 2020-2023  润新知