HRBUST 1867 差分+BIT

Posted yyjxx2010xyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HRBUST 1867 差分+BIT相关的知识,希望对你有一定的参考价值。

我在群上看到的某道题,貌似用的是线段树,因为前几天遇到差分,再用BIT动态维护一下前缀和,感觉可做就A了. 加了个读优就Rank1啦! 某个不常见的题库,还是把题目拿下来把..

 1 Description
 2 给你一些二进制串,我们有对这些数有两种操作。
 3 \'I i j\'    将[i,j]内的所有数取反(0变1,1变0)
 4 \'Q i\'    输出第i个数是多少
 5 下标从1开始,输入串允许有前导0
 6 Input
 7 输入包含一个整数T(T<=10000),表示测试样例个数。
 8 每组样例的第一行有一个长度为n的01串(n<=20000)
 9 第二行有一个整数Q(Q<=10000)代表将会有多少个操作
10 Output
11 输出每一个Q i的结果
12 Sample Input
13 2
14 0011001100
15 6
16 I 1 10
17 I 2 7
18 Q 2
19 Q 1
20 Q 7
21 Q 5
22 1011110111
23 6
24 I 1 10
25 I 2 7
26 Q 2
27 Q 1
28 Q 7
29 Q 5
30 Sample Output
31 Case 1:
32 0
33 1
34 1
35 0
36 Case 2:
37 0
38 0
39 0
40 1
Problem
 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <algorithm>
 5 #include <bitset>
 6 using namespace std;
 7 const int Maxn=20010;
 8 int Kase,B[Maxn],n,pos,l,r,C[Maxn<<1],Q;
 9 char str[Maxn];
10 inline void Get_Int(int &x)
11 {
12     x=0;  char ch=getchar(); int f=1;
13     while (ch<\'0\' || ch>\'9\') {if (ch==\'-\') f=-1; ch=getchar();}
14     while (ch>=\'0\' && ch<=\'9\') {x=x*10+ch-\'0\'; ch=getchar();} x*=f;
15 }
16 inline void Put_Int(int x)
17 {
18     char ch[20];  int top=0;
19     if (x==0) ch[++top]=\'0\';
20     while (x) ch[++top]=x%10+\'0\',x/=10;
21     while (top) putchar(ch[top--]); putchar(\'\\n\');
22 }
23 inline int lowbit(int x) {return x&(-x);}
24 inline int Query(int x)
25 {
26     int ret=0;
27     for (int i=x;i;i-=lowbit(i)) ret=(ret+C[i])%2;
28     return ret;
29 }
30 inline int Add(int x,int v)
31 {
32     for (int i=x;i<=n;i+=lowbit(i)) C[i]=(C[i]+v)%2;
33 }
34 int main()
35 {
36     Get_Int(Kase);
37     for (int kase=1;kase<=Kase;kase++)
38     {
39         scanf("%s",str+1);
40         printf("Case %d:\\n",kase);
41         n=strlen(str+1);
42         memset(C,0,sizeof(C));
43         for (int i=1;i<=n;i++) B[i]=str[i]-\'0\';
44         Get_Int(Q);
45         for (int i=1;i<=Q;i++)
46         {
47             char ch=getchar();
48             while (ch!=\'Q\' && ch!=\'I\') ch=getchar();
49             if (ch==\'Q\')
50             {
51                 Get_Int(pos);
52                 int tmp=(B[pos]+Query(pos))%2;
53                 if (tmp==1) putchar(\'1\'),putchar(\'\\n\');
54                 else putchar(\'0\'),putchar(\'\\n\');
55             }
56             if (ch==\'I\')
57             {
58                 Get_Int(l),Get_Int(r);
59                 Add(l,1),Add(r+1,1);
60             }
61         }
62     }
63     return 0;
64 }
C++

 

以上是关于HRBUST 1867 差分+BIT的主要内容,如果未能解决你的问题,请参考以下文章

hrbust 训练赛 1109

hrbust 1184

hrbust oj 1526+2028 树状数组

hrbust 1721 A + B = 0 map的应用

hrbust 2373 小C的问题

hrbust oj 1025 (计算几何+近似计算)