标签:
2 5 2 bwbwb 0 0 4 0 1 3 5 5 wbwbw 0 0 4 0 0 2 0 2 4 1 2 b 0 0 4
Case 1: 1 1 Case 2: 2 1 1 0
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 50010; 4 struct node{ 5 int lt,rt,sum; 6 }tree[maxn<<2]; 7 int num[maxn]; 8 void build(int L,int R,int v){ 9 tree[v].lt = L; 10 tree[v].rt = R; 11 if(L == R){ 12 tree[v].sum = num[L]; 13 return; 14 } 15 int mid = (L + R)>>1; 16 build(L,mid,v<<1); 17 build(mid+1,R,v<<1|1); 18 tree[v].sum = tree[v<<1].sum + tree[v<<1|1].sum; 19 } 20 void update(int id,int val,int v){ 21 if(tree[v].lt == tree[v].rt){ 22 tree[v].sum = val; 23 return; 24 } 25 int mid = (tree[v].lt + tree[v].rt)>>1; 26 if(id <= mid) update(id,val,v<<1); 27 if(id > mid) update(id,val,v<<1|1); 28 tree[v].sum = tree[v<<1].sum + tree[v<<1|1].sum; 29 } 30 int query(int lt,int rt,int v){ 31 if(lt <= tree[v].lt && rt >= tree[v].rt) return tree[v].sum; 32 int mid = (tree[v].lt + tree[v].rt)>>1,ans = 0; 33 if(lt <= mid) ans += query(lt,rt,v<<1); 34 if(rt > mid) ans += query(lt,rt,v<<1|1); 35 return ans; 36 } 37 char str[maxn],tmp[20]; 38 int main(){ 39 int T,n,m,op,a,b,cs = 1; 40 scanf("%d",&T); 41 while(T--){ 42 scanf("%d %d",&n,&m); 43 scanf("%s",str); 44 printf("Case %d:\n",cs++); 45 memset(num,0,sizeof num); 46 for(int i = 2; i < n; ++i) 47 if(str[i-2] == ‘w‘ && str[i-1] == ‘b‘ && str[i] == ‘w‘) num[i] = 1; 48 build(0,n-1,1); 49 while(m--){ 50 scanf("%d %d",&op,&a); 51 if(op){ 52 scanf("%s",tmp); 53 if(str[a] == tmp[0]) continue; 54 if(a >= 2 && str[a-2] == ‘w‘ && str[a-1] ==‘b‘) 55 update(a,str[a] == ‘w‘?0:1,1); 56 if(a >= 1 && a + 1 < n && str[a-1] == ‘w‘ && str[a+1] == ‘w‘) 57 update(a+1,str[a] == ‘b‘?0:1,1); 58 if(a + 2 < n && str[a+1] == ‘b‘ && str[a+2] == ‘w‘) 59 update(a+2,str[a] == ‘w‘?0:1,1); 60 str[a] = tmp[0]; 61 }else{ 62 scanf("%d",&b); 63 printf("%d\n",b-a<2?0:query(a+2,b,1)); 64 } 65 } 66 } 67 return 0; 68 }
标签:
原文地址:http://www.cnblogs.com/crackpotisback/p/4437974.html