HDU 4046【树状数组】

题目:Panda

题意:

长长一篇情书纯是忽悠选手们的。给一连串由wb组成的字符中,从中找出"wbw"子串个数,有两种操作,操作0,L,R,询问L~R子串内包含"wbw"的个数。操作1,k,ch,将第k个字符更换为ch。

解题思路:

带着绵绵情意看完了整个题目后就崩出树状数组了,很明显啊,动态更改值,动态个数。sum(i)表示1-i字符串内包含"wbw"子串个数,则对第一个询问操作,直接可输出sum(R)-sum(L+1)即可,想想为什么要L+1呢? 对第二个操作,判断下更改前和更改后的情况,适当更新树状数组即可。详情代码。

View Code
 1 #include <iostream>
2 #include <cstdio>
3 #include <string>
4 #include <cstring>
5 #include <algorithm>
6 #include <vector>
7 #include <map>
8
9 using namespace std;
10
11 const int MAX = 50000 + 10;
12 int N, M;
13 char Letter[MAX];
14 int C[MAX];
15
16 int lowBit(int k)
17 {
18 return k & (k ^ (k - 1));
19 }
20
21 void add(int pos, int val)
22 {
23 while(pos <= N)
24 {
25 C[pos] += val;
26 pos += lowBit(pos);
27 }
28 }
29
30 int sum(int end)
31 {
32 int sum = 0;
33 while(end > 0)
34 {
35 sum += C[end];
36 end -= lowBit(end);
37 }
38 return sum;
39 }
40
41 int main()
42 {
43 freopen("in.txt","r",stdin);
44 int T;
45 int op, k, l, r;
46 char ch;
47 scanf("%d", &T);
48 for(int t = 1; t <= T; ++t)
49 {
50 printf("Case %d:\n", t);
51 memset(C, 0, sizeof(C));
52 scanf("%d%d", &N, &M);
53 scanf("%s", Letter + 1);
54 for(int i = 3; i <= N; ++i)
55 {
56 if(Letter[i - 2] == 'w' && Letter[i - 1] == 'b' && Letter[i] == 'w')
57 add(i, 1);
58 }
59 for(int i = 1; i <= M; ++i)
60 {
61 scanf("%d", &op);
62 if(op == 0)
63 {
64 scanf("%d%d", &l, &r);
65 l++, r++;
66 if(r - l < 2)
67 printf("0\n");
68 else
69 printf("%d\n", sum(r) - sum(l + 1));
70 }
71 if(op == 1)
72 {
73 scanf("%d %c", &k, &ch);
74 k++;
75 if(ch == Letter[k])
76 continue;
77 if(k >= 3 && Letter[k - 2] == 'w' && Letter[k - 1] == 'b' && Letter[k] == 'w')
78 add(k, -1);
79 if(k >= 3 && Letter[k - 2] == 'w' && Letter[k - 1] == 'b' && ch == 'w')
80 add(k, 1);
81 if(k >= 2 && k + 1 <= N && Letter[k - 1] == 'w' && Letter[k] == 'b' && Letter[k + 1] == 'w')
82 add(k + 1, -1);
83 if(k >= 2 && k + 1 <= N && Letter[k - 1] == 'w' && ch == 'b' && Letter[k + 1] == 'w')
84 add(k + 1, 1);
85 if(k + 2 <= N && Letter[k] == 'w' && Letter[k + 1] == 'b' && Letter[k + 2] == 'w')
86 add(k + 2, -1);
87 if(k + 2 <= N && ch == 'w' && Letter[k + 1] == 'b' && Letter[k + 2] == 'w')
88 add(k + 2, 1);
89 Letter[k] = ch;
90 }
91 }
92 }
93 return 0;
94 }



posted on 2011-09-27 02:22  Kenfly  阅读(356)  评论(0编辑  收藏  举报