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: ", ++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 ", !(str[a] - '0')); else printf("%d ", (str[a] - '0')); } } } return 0; }