标签:
Time Limit: 10000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2565 Accepted Submission(s): 861
13075023 | 2015-03-09 18:29:04 | Accepted | 4046 | 1466MS | 5532K | 4484 B | G++ | czy |
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #define N 50005 5 6 using namespace std; 7 8 int n,m; 9 int T; 10 int ccnt; 11 char s[N]; 12 13 typedef struct 14 { 15 int num; 16 int sw; 17 int sbw; 18 int ew; 19 int ewb; 20 }PP; 21 22 PP p[4*N]; 23 int mp[4*N]; 24 int ll[4*N],rr[4*N]; 25 26 PP build(int i,int l,int r) 27 { 28 ll[i]=l; 29 rr[i]=r; 30 if(l==r){ 31 mp[l]=i; 32 p[i].num=0; 33 if(s[l]==‘b‘) {p[i].ew=p[i].ewb=p[i].sw=p[i].sbw=0;} 34 else {p[i].sw=1;p[i].sbw=0;p[i].ew=1;p[i].ewb=0;} 35 // printf(" i=%d l=%d r=%d num=%d sw=%d sbw=%d ew=%d ewb=%d\n", i,l,r,p[i].num,p[i].sw,p[i].sbw,p[i].ew,p[i].ewb); 36 return p[i]; 37 } 38 PP le,ri; 39 int mid=(l+r)/2; 40 le=build(i*2,l,mid); 41 ri=build(i*2+1,mid+1,r); 42 43 p[i].num=le.num+ri.num; 44 if(le.ew * ri.sbw ==1){ 45 p[i].num++; 46 } 47 if(le.ewb * ri.sw ==1){ 48 p[i].num++; 49 } 50 p[i].sw=le.sw; 51 p[i].ew=ri.ew; 52 if(p[i].sw==0 && s[l+1]==‘w‘){ 53 p[i].sbw=1; 54 } 55 else{ 56 p[i].sbw=0; 57 } 58 59 if(p[i].ew==0 && s[r-1]==‘w‘){ 60 p[i].ewb=1; 61 } 62 else{ 63 p[i].ewb=0; 64 } 65 // printf(" i=%d l=%d r=%d num=%d sw=%d sbw=%d ew=%d ewb=%d\n", i,l,r,p[i].num,p[i].sw,p[i].sbw,p[i].ew,p[i].ewb); 66 return p[i]; 67 } 68 69 void ini() 70 { 71 scanf("%d%d",&n,&m); 72 scanf("%s",s+1); 73 //printf(" n=%d m=%d s=%s\n",n,m,s+1 ); 74 build(1,1,n); 75 // for(int i=1;i<=9;i++) printf("i=%d num=%d\n",i,p[i].num ); 76 } 77 78 PP query(int i,int l,int r,int L ,int R) 79 { 80 PP te; 81 if(r<L || l>R){ 82 te.num=0;te.sw=te.sbw=te.ew=te.ewb=0; 83 return te; 84 } 85 if(l==r) return p[i]; 86 if(l>=L && r<=R){ 87 //printf(" q i=%d l=%d r=%d num=%d sw=%d sbw=%d ew=%d ewb=%d\n", i,l,r,p[i].num,p[i].sw,p[i].sbw,p[i].ew,p[i].ewb); 88 return p[i]; 89 } 90 int mid=(l+r)/2; 91 PP le,ri; 92 if(mid>=L){ 93 le=query(i*2,l,mid,L,R); 94 } 95 else{ 96 le.num=0;le.sw=le.sbw=le.ew=le.ewb=-2; 97 } 98 if(mid<R){ 99 ri=query(i*2+1,mid+1,r,L,R); 100 } 101 else{ 102 ri.num=0;ri.sw=ri.sbw=ri.ew=ri.ewb=-2; 103 } 104 te.num=le.num+ri.num; 105 if(le.ew * ri.sbw ==1){ 106 te.num++; 107 } 108 if(le.ewb * ri.sw ==1){ 109 te.num++; 110 } 111 te.sw=le.sw; 112 te.ew=ri.ew; 113 if(l+1<=R && te.sw==0 && s[l+1]==‘w‘){ 114 te.sbw=1; 115 } 116 else{ 117 te.sbw=0; 118 } 119 120 if(r-1>=L && te.ew==0 && s[r-1]==‘w‘){ 121 te.ewb=1; 122 } 123 else{ 124 te.ewb=0; 125 } 126 //printf(" le q i=%d l=%d r=%d num=%d sw=%d sbw=%d ew=%d ewb=%d\n", i,l,r,le.num,le.sw,le.sbw,le.ew,le.ewb); 127 //printf(" ri q i=%d l=%d r=%d num=%d sw=%d sbw=%d ew=%d ewb=%d\n", i,l,r,ri.num,ri.sw,ri.sbw,ri.ew,ri.ewb); 128 //printf(" q i=%d l=%d r=%d num=%d sw=%d sbw=%d ew=%d ewb=%d\n", i,l,r,te.num,te.sw,te.sbw,te.ew,te.ewb); 129 return te; 130 } 131 132 void updata(int i) 133 { 134 int l,r; 135 l=ll[i]; 136 r=rr[i]; 137 if(i==0) return; 138 PP le,ri; 139 le=p[i*2];ri=p[i*2+1]; 140 p[i].num=le.num+ri.num; 141 if(le.ew * ri.sbw ==1){ 142 p[i].num++; 143 } 144 if(le.ewb * ri.sw ==1){ 145 p[i].num++; 146 } 147 p[i].sw=le.sw; 148 p[i].ew=ri.ew; 149 if(p[i].sw==0 && s[l+1]==‘w‘){ 150 p[i].sbw=1; 151 } 152 else{ 153 p[i].sbw=0; 154 } 155 156 if(p[i].ew==0 && s[r-1]==‘w‘){ 157 p[i].ewb=1; 158 } 159 else{ 160 p[i].ewb=0; 161 } 162 updata(i/2); 163 } 164 165 void solve() 166 { 167 int t,L,R; 168 int k; 169 char ch[3]; 170 int i,j; 171 PP ans; 172 for(j=1;j<=m;j++){ 173 scanf("%d",&t); 174 // printf(" j=%d t=%d\n",j,t ); 175 if(t==0){ 176 scanf("%d%d",&L,&R); 177 // printf(" L=%d R=%d\n",L,R ); 178 ans=query(1,1,n,L+1,R+1); 179 printf("%d\n", ans.num); 180 } 181 else{ 182 scanf("%d%s",&k,ch); 183 // printf(" j=%d t=%d k=%d ch=%s\n", j,t,k,ch); 184 k++; 185 s[k]=ch[0]; 186 i=mp[k]; 187 188 p[i].num=0; 189 if(s[k]==‘b‘) {p[i].ew=p[i].ewb=p[i].sw=p[i].sbw=0;} 190 else {p[i].sw=1;p[i].sbw=0;p[i].ew=1;p[i].ewb=0;} 191 updata(i/2); 192 // for(int i=1;i<=9;i++) printf(" i=%d num=%d sw=%d sbw=%d ew=%d ewb=%d\n", i,p[i].num,p[i].sw,p[i].sbw,p[i].ew,p[i].ewb); 193 } 194 } 195 } 196 197 int main() 198 { 199 scanf("%d",&T); 200 for(ccnt=1;ccnt<=T;ccnt++){ 201 ini(); 202 printf("Case %d:\n",ccnt ); 203 solve(); 204 } 205 }
标签:
原文地址:http://www.cnblogs.com/njczy2010/p/4324222.html