• hdu4553


      1 /*
      2 题意: 中文题
      3 
      4 分析:就是区间覆盖,然后求最前连续长度为len的0串或01串的起始位置;
      5 conl[rt][0]表示区间从左开始最长0串长度,
      6 conr[rt][0]表示区间从右开始最长0串长度;
      7 conl[rt][1]表示区间从左开始最长01串长度,
      8 conr[rt][1]表示区间从右开始最长01串长度;
      9 然后就是模拟; 
     10  
     11 */
     12 #include<cstdio>
     13 #include<cstring>
     14 #include<iostream>
     15 #include<algorithm>
     16 #include<cmath>
     17 #include<cstdlib>
     18 #include<queue>
     19 #include<vector>
     20 #define lson l,m,rt<<1
     21 #define rson m+1,r,rt<<1|1
     22 using namespace std;
     23 const int N=100000+10;
     24 
     25 int conl[N<<2][2],conr[N<<2][2],mx[N<<2][2],col[N<<2];
     26 //0表示空,1表示DS+kong 
     27 void pushup(int l,int m,int r,int rt){
     28     for (int i=0;i<2;i++){
     29         if (conl[rt<<1][i]==m-l+1){
     30             conl[rt][i]=conl[rt<<1][i]+conl[rt<<1|1][i];
     31         }else conl[rt][i]=conl[rt<<1][i];
     32         if (conr[rt<<1|1][i]==r-m){
     33             conr[rt][i]=conr[rt<<1|1][i]+conr[rt<<1][i];
     34         }else conr[rt][i]=conr[rt<<1|1][i];
     35         
     36         int t=conr[rt<<1][i]+conl[rt<<1|1][i];
     37         mx[rt][i]=max(t,max(mx[rt<<1][i],mx[rt<<1|1][i]));
     38     }
     39 }
     40 void pushdown(int l,int m,int r,int rt){
     41     if (col[rt]!=-1){
     42         if (col[rt]==0){
     43             conl[rt<<1][0]=conr[rt<<1][0]=mx[rt<<1][0]=m-l+1;
     44             conl[rt<<1][1]=conr[rt<<1][1]=mx[rt<<1][1]=m-l+1;
     45             
     46             conl[rt<<1|1][0]=conr[rt<<1|1][0]=mx[rt<<1|1][0]=r-m;
     47             conl[rt<<1|1][1]=conr[rt<<1|1][1]=mx[rt<<1|1][1]=r-m;
     48             
     49         }else if (col[rt]==1){
     50             conl[rt<<1][0]=conr[rt<<1][0]=mx[rt<<1][0]=0;
     51             conl[rt<<1][1]=conr[rt<<1][1]=mx[rt<<1][1]=m-l+1;
     52             
     53             conl[rt<<1|1][0]=conr[rt<<1|1][0]=mx[rt<<1|1][0]=0;
     54             conl[rt<<1|1][1]=conr[rt<<1|1][1]=mx[rt<<1|1][1]=r-m;
     55             
     56         }else if (col[rt]==2){
     57             conl[rt<<1][0]=conr[rt<<1][0]=mx[rt<<1][0]=0;
     58             conl[rt<<1][1]=conr[rt<<1][1]=mx[rt<<1][1]=0;
     59             
     60             conl[rt<<1|1][0]=conr[rt<<1|1][0]=mx[rt<<1|1][0]=0;
     61             conl[rt<<1|1][1]=conr[rt<<1|1][1]=mx[rt<<1|1][1]=0;
     62             
     63         }
     64         col[rt<<1]=col[rt<<1|1]=col[rt];
     65         col[rt]=-1;
     66     }
     67 }
     68 void build(int l,int r,int rt){
     69     mx[rt][0]=conl[rt][0]=conr[rt][0]=r-l+1;
     70     mx[rt][1]=conl[rt][1]=conr[rt][1]=r-l+1;
     71     col[rt]=-1;
     72     if (l==r) return ;
     73     int m=(l+r)>>1;
     74     build(lson);
     75     build(rson);
     76     pushup(l,m,r,rt);
     77 }
     78 void update(int L,int R,int z,int l,int r,int rt){
     79     if (L<=l && r<=R){
     80         if (z==0){
     81             conl[rt][0]=conr[rt][0]=mx[rt][0]=r-l+1;
     82             conl[rt][1]=conr[rt][1]=mx[rt][1]=r-l+1;
     83         }else if (z==1){
     84             conl[rt][0]=conr[rt][0]=mx[rt][0]=0;
     85             conl[rt][1]=conr[rt][1]=mx[rt][1]=r-l+1;
     86             
     87         }else if (z==2){
     88             conl[rt][0]=conr[rt][0]=mx[rt][0]=0;
     89             conl[rt][1]=conr[rt][1]=mx[rt][1]=0;
     90         }
     91         col[rt]=z;
     92         return;
     93     }
     94     int m=(l+r)>>1;
     95     pushdown(l,m,r,rt);
     96     if (L<=m) update(L,R,z,lson);
     97     if (m< R) update(L,R,z,rson);
     98     pushup(l,m,r,rt);
     99 }
    100 int  query(int k,int len,int l,int r,int rt){
    101     if (mx[rt][k]<len) return -1;
    102     int m=(l+r)>>1;
    103     pushdown(l,m,r,rt);
    104     if (mx[rt<<1][k]>=len) return query(k,len,lson);
    105     else if (conr[rt<<1][k]+conl[rt<<1|1][k]>=len) return m-conr[rt<<1][k]+1;
    106     else if (mx[rt<<1|1][k]>=len) return query(k,len,rson);
    107 }
    108 int n,m;
    109 int main(){
    110     int T,cas=0;
    111     char s[15];
    112     int len;
    113     scanf("%d",&T);
    114     while (T--){
    115         scanf("%d%d",&n,&m);
    116         printf("Case %d:\n",++cas);
    117         build(1,n,1);
    118         for (int i=0;i<m;i++){
    119             scanf("%s",s);
    120             if (s[0]=='D'){
    121                 scanf("%d",&len);
    122                 int t=query(0,len,1,n,1); 
    123                 if (t==-1){
    124                     printf("fly with yourself\n");
    125                 }else {
    126                     printf("%d,let's fly\n",t);
    127                     update(t,t+len-1,1,1,n,1);
    128                 }
    129             }else if (s[0]=='N'){
    130                 scanf("%d",&len);
    131                 int t=query(0,len,1,n,1); 
    132                 if (t==-1){
    133                     t=query(1,len,1,n,1);
    134                     if (t==-1) printf("wait for me\n");
    135                     else {
    136                         printf("%d,don't put my gezi\n",t);
    137                         update(t,t+len-1,2,1,n,1);
    138                     }
    139                 }else {
    140                     printf("%d,don't put my gezi\n",t);
    141                     update(t,t+len-1,2,1,n,1);
    142                 }
    143             
    144             }else if (s[0]=='S'){
    145                 int x,y;
    146                 scanf("%d%d",&x,&y);
    147                 printf("I am the hope of chinese chengxuyuan!!\n");
    148                 update(x,y,0,1,n,1);
    149             }
    150             
    151         }
    152     }
    153     return 0;
    154 }
  • 相关阅读:
    python基本数据类型之整型和浮点型
    Java学习路线
    Linux学习笔记之VIM
    Java基础之流程控制
    Linux学习笔记之Shell
    Java基础之数据类型
    论文提交说明
    IDEA安装教程
    Link summary for writing papers
    1 类基础知识
  • 原文地址:https://www.cnblogs.com/Rlemon/p/3086198.html
Copyright © 2020-2023  润新知