Time Limit: 2 second(s) | Memory Limit: 64 MB |
Given a binary number, we are about to do some operations on the number. Two types of operations can be here.
'I i j' which means invert the bit from i to j (inclusive)
'Q i' answer whether the ith bit is 0 or 1
The MSB (most significant bit) is the first bit (i.e. i=1). The binary number can contain leading zeroes.
Input
Input starts with an integer T (≤ 10), denoting the number of test cases.
Each case starts with a line containing a binary integer having length n (1 ≤ n ≤ 105). The next line will contain an integer q (1 ≤ q ≤ 50000) denoting the number of queries. Each query will be either in the form 'I i j' where i, j are integers and 1 ≤ i ≤ j ≤ n. Or the query will be in the form 'Q i' where i is an integer and 1 ≤ i ≤ n.
Output
For each case, print the case number in a single line. Then for each query 'Q i' you have to print 1 or 0 depending on the ith bit.
Sample Input | Output for Sample Input |
2 0011001100 6 I 1 10 I 2 7 Q 2 Q 1 Q 7 Q 5 1011110111 6 I 1 10 I 2 7 Q 2 Q 1 Q 7 Q 5 | Case 1: 0 1 1 0 Case 2: 0 0 0 1 |
Note
Dataset is huge, use faster i/o methods.
看到了RMQ,用数状数组或者线段树进行维护。利用树状数组的快速区间求和维护,将每个点的反转次数进进行记录,奇数次后肯定的发生改变,偶数次就不用进行改变。
没有注意树状数组的上界限n,导致n次WA,我现在只想要脑残片
#include <map>
#include <set>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <iostream>
#include <stack>
#include <cmath>
#include <string>
#include <vector>
#include <cstdlib>
//#include <bits/stdc++.h>
//#define LOACL
#define space " "
using namespace std;
//typedef long long LL;
//typedef __int64 Int;
typedef pair<int, int> paii;
const int INF = 0x3f3f3f3f;
const double ESP = 1e-5;
const double PI = acos(-1.0);
const int MOD = 1e9 + 7;
const int MAXN = 100000 + 10;
int lowbit(int x) {return x&(-x);}
int n, bit[MAXN];
char str[MAXN], s[3];
int sum(int x) {
int s = 0;
while (x > 0) {
s += bit[x];
x -= lowbit(x);
}
return s;
}
void add(int x, int y) {
while (x <= n) {
bit[x] += y;
x += lowbit(x);
}
}
int main() {
int T, a, b, p;
int Kcase = 0;
scanf("%d", &T);
while (T--) {
scanf("%s", str + 1);
scanf("%d", &p); str[0] = '1';
n = strlen(str) - 1;
printf("Case %d:\n", ++Kcase);
memset(bit, 0, sizeof(bit));
while (p--) {
scanf("%s", s);
if (s[0] == 'I') {
scanf("%d%d", &a, &b);
add(a, -1);
add(b + 1, 1);
}
else {
scanf("%d", &a);
if (sum(a) & 1) printf("%d\n", !(str[a] - '0'));
else printf("%d\n", (str[a] - '0'));
}
}
}
return 0;
}