我在群上看到的某道题,貌似用的是线段树,因为前几天遇到差分,再用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
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(' '); 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: ",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(' '); 54 else putchar('0'),putchar(' '); 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 }