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 }