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++

时间: 2024-10-14 05:39:03

HRBUST 1867 差分+BIT的相关文章

Codeforces 841D Leha and another game about graph - 差分

Leha plays a computer game, where is on each level is given a connected graph with n vertices and m edges. Graph can contain multiple edges, but can not contain self loops. Each vertex has an integer di, which can be equal to 0, 1 or  - 1. To pass th

hdu 1867 A + B for you again

题目: 链接:点击打开链接 题意: 找出两个字符串的后缀和前缀公共串,输出最短的串,并且为最小字典序. 算法: KMP算法. 思路: 取最小字典序输出... 代码: #include<iostream> #include<cstdio> #include<cstring> using namespace std; #define MAXN 100010 char s1[MAXN],s2[MAXN]; int next[MAXN]; void get_nextval(ch

【NOIP2015】运输计划(树上差分,二分答案)

题意:一棵有边权的树上有m条路径,要求选择一条边使其边权变为0,使得最大路径长度和最小 n,m<=300000 思路:直接求最优方案不可做,但检验对于某一个ans是否能有方案是可行的 取出所有总长度>ans的路径,求它们的交,取交集中长度最大的一条,设值为c[i],总长度最长的设为max 比较max-c[i]与ans的关系即可 路径求交因为是离线的,可以暴力树剖,也可以分类讨论维护路径交 但对于这个离线的问题,可以差分来做 对于路径(a[i],b[i]),设c[i]=lca 分为a[i]到lc

差分约束

1.bzoj3436 思路: 差分约束根据限制条件建图,注意要有一个超级源点向所有点连一条边权为0的边建图看代码. 然后spfa判负环,写bfs会超时的......实测n遍. #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #define inf 0x7fffffff #define ll long long #define N 100007 using na

bzoj2788 festival 差分约束

填坑中--链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2788 题意: 有$n$个正整数$X1,X2,...,Xn$,再给出$m1+m2$个限制条件,限制分为两类:1. 给出$a,b(1<=a,b<=n)$,要求满足$Xa + 1 = Xb$2. 给出$c,d (1<=c,d<=n)$,要求满足$Xc <= Xd$在满足所有限制的条件下,求集合${Xi}$大小的最大值. 首先看情况我们也知道是差分约束-- 但是这个差分

ZZULI 1867: 礼上往来【错位排序】

1867: 礼上往来 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 216  Solved: 65 SubmitStatusWeb Board Description 每当节日来临,女友众多的xxx总是能从全国各地的女友那里收到各种礼物. 有礼物收到当然值得高兴,但回礼确是件麻烦的事! 无论多麻烦,总不好意思收礼而不回礼,那也不是xxx的风格. 现在,即爱面子又抠门的xxx想出了一个绝妙的好办法:他准备将各个女友送来的礼物合理分配,再回送不同女友,

POJ 1201 Intervals 差分约束

http://poj.org/problem?id=1201 TLE了很久,因为用了cin..... 思路和其他差分约束差不多,http://www.cppblog.com/menjitianya/archive/2015/11/19/212292.html 如果区间[a, b]中至少有c个元素,如果用上面的博客,那么说明xa - xb >= c,但是注意这里是闭区间,xa - xb是不包括b这个点的, 就比如用了[a, b]有c个元素,[b, d]有x个,那么ans = c + x - 1个,

【bzoj2330】: [SCOI2011]糖果 图论-差分约束-SPFA

[bzoj2330]: [SCOI2011]糖果 恩..就是裸的差分约束.. x=1 -> (A,B,0) (B,A,0) x=2 -> (A,B,1)  [这个情况加个A==B无解的要特判] x=3 -> (B,A,0)  [恩这个是不少于一开始zz建反了] x=4 -> (B,A,1) x=5 -> (A,B,0) 然后源点到所有点建1的边[恩据说有条链所以要反着连]跑最长路就好了 1 /* http://www.cnblogs.com/karl07/ */ 2 #inc

POJ1275出纳员的雇佣【差分约束】

出纳员的雇佣 Tehran的一家每天24小时营业的超市,需要一批出纳员来满足它的需要.超市经理雇佣你来帮他解决问题:超市在每天的不同时段需要不同数目的出纳员(例如:午夜时只需一小批,而下午则需要很多)来为顾客提供优质服务.他希望雇佣最少数目的出纳员.经理已经提供你一天的每一小时需要出纳员的最少数量--R(0), R(1), ..., R(23).R(0)表示从午夜到上午1:00需要出纳员的最少数目,R(1)表示上午1:00到2:00之间需要的,等等.每一天,这些数据都是相同的.有N人申请这项工作