• poj 3667 Hotel


    题目大意:还是一个旅馆里有N个房间,开始均为空。有两种操作:

    (1)查询是否有d个连续空房间,有则输出序号最小的房间号,即最靠左的房间号。否则输出0

    (2)清空从a房间开始的连续b个房间。

    代码如下:

    View Code
      1 #include <stdio.h>
      2 
      3 #define lson l,m,rt<<1
      4 
      5 #define rson m+1,r,rt<<1|1
      6 
      7 #define maxn 50000
      8 
      9 struct node
     10 
     11 {
     12 
     13     int llen,rlen,maxlen,c;
     14 
     15 }setree[maxn<<2];
     16 
     17 int max(int a,int b)
     18 
     19 {
     20 
     21     return a>b?a:b;
     22 
     23 }
     24 
     25 void build(int l,int r,int rt)
     26 
     27 {
     28 
     29     setree[rt].llen=setree[rt].rlen=setree[rt].maxlen=r-l+1;
     30 
     31     setree[rt].c=-1;
     32 
     33     if(l==r)
     34 
     35     return;
     36 
     37     int m=(l+r)>>1;
     38 
     39     build(lson);
     40 
     41     build(rson);
     42 
     43 }
     44 
     45 void pushdown(int rt,int m)
     46 
     47 {
     48 
     49     if(setree[rt].c!=-1){
     50 
     51         if(setree[rt].c==1){
     52 
     53             setree[rt<<1].llen=setree[rt<<1].rlen=setree[rt<<1].maxlen=0;
     54 
     55             setree[rt<<1|1].llen=setree[rt<<1|1].rlen=setree[rt<<1|1].maxlen=0;
     56 
     57             setree[rt<<1].c=setree[rt<<1|1].c=1;
     58 
     59         }
     60 
     61         else if(setree[rt].c==0){
     62 
     63             setree[rt<<1].llen=setree[rt<<1].rlen=setree[rt<<1].maxlen=m-m/2;
     64 
     65             setree[rt<<1|1].llen=setree[rt<<1|1].rlen=setree[rt<<1|1].maxlen=m/2;
     66 
     67             setree[rt<<1].c=setree[rt<<1|1].c=0;
     68 
     69         }
     70 
     71         setree[rt].c=-1;
     72 
     73     }
     74 
     75 }
     76 
     77 void pushup(int rt,int m)
     78 
     79 {
     80 
     81     setree[rt].llen=setree[rt<<1].llen;
     82 
     83     if(setree[rt<<1].llen==m-m/2)
     84 
     85     setree[rt].llen+=setree[rt<<1|1].llen;
     86 
     87     setree[rt].rlen=setree[rt<<1|1].rlen;
     88 
     89     if(setree[rt<<1|1].rlen==m/2)
     90 
     91     setree[rt].rlen+=setree[rt<<1].rlen;
     92 
     93     setree[rt].maxlen=max(setree[rt<<1].rlen+setree[rt<<1|1].llen,max(setree[rt<<1].maxlen,setree[rt<<1|1].maxlen));
     94 
     95 }
     96 
     97 void update(int l,int r,int rt,int L,int R,int c)
     98 
     99 {
    100 
    101     if(L<=l&&r<=R){
    102 
    103         setree[rt].llen=setree[rt].rlen=setree[rt].maxlen=c?0:r-l+1;
    104 
    105         setree[rt].c=c?1:0;
    106 
    107         return;
    108 
    109     }
    110 
    111     pushdown(rt,r-l+1);
    112 
    113     int m=(l+r)>>1;
    114 
    115     if(L<=m)
    116 
    117     update(lson,L,R,c);
    118 
    119     if(R>m)
    120 
    121     update(rson,L,R,c);
    122 
    123     pushup(rt,r-l+1);
    124 
    125 }
    126 
    127 int query(int l,int r,int rt,int num)
    128 
    129 {
    130 
    131     if(l==r)
    132 
    133     return l;
    134 
    135     pushdown(rt,r-l+1);
    136 
    137     int m=(l+r)>>1;
    138 
    139     if(setree[rt<<1].maxlen>=num)
    140 
    141     return query(lson,num);
    142 
    143     if(setree[rt<<1].rlen+setree[rt<<1|1].llen>=num)
    144 
    145     return m-setree[rt<<1].rlen+1;
    146 
    147     return query(rson,num);
    148 
    149 }
    150 
    151 int main()
    152 
    153 {
    154 
    155     int n,m;
    156 
    157     scanf("%d%d",&n,&m);
    158 
    159     build(1,n,1);
    160 
    161     while(m--){
    162 
    163         int op,a,b;
    164 
    165         scanf("%d",&op);
    166 
    167         if(op==1){
    168 
    169             scanf("%d",&a);
    170 
    171             if(a>setree[1].maxlen){
    172 
    173             printf("0\n");
    174 
    175             continue;
    176 
    177             }
    178 
    179             int temp=query(1,n,1,a);
    180 
    181             printf("%d\n",temp);
    182 
    183             update(1,n,1,temp,temp+a-1,1);
    184 
    185         }
    186 
    187         else if(op==2){
    188 
    189             scanf("%d%d",&a,&b);
    190 
    191             update(1,n,1,a,a+b-1,0);
    192 
    193         }
    194 
    195     }
    196 
    197 }
  • 相关阅读:
    CF div2 325 C
    CF div2 325 B
    CF div2 325 A
    CF div2 322 C
    CF div2 322 B
    CF div2 322 A
    Sudoku Solver POJ 2676 LightOJ 1397
    逆序数(归并排序 )
    RMQ算法
    Socket编程:listen()函数英文翻译
  • 原文地址:https://www.cnblogs.com/kim888168/p/2755100.html
Copyright © 2020-2023  润新知