码迷,mamicode.com
首页 > 其他好文 > 详细

HRBUST 1867 差分+BIT

时间:2016-05-22 00:44:57      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:

我在群上看到的某道题,貌似用的是线段树,因为前几天遇到差分,再用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

标签:

原文地址:http://www.cnblogs.com/yyjxx2010xyu/p/5515862.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!