Skip to content

Commit 64464e6

Browse files
committed
X or What? (AC)
1 parent 0b28a77 commit 64464e6

File tree

1 file changed

+27
-35
lines changed

1 file changed

+27
-35
lines changed

KickStart/2019/Round-D/X_or_What/solution.cpp

+27-35
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include <iostream>
1010
#include <vector>
11+
#include <set>
1112
using namespace std;
1213

1314
bool isEvenBits(int num) {
@@ -25,57 +26,48 @@ bool isEvenBits(int num) {
2526
return (cnt % 2 == 0);
2627
}
2728

28-
int countEvenBits(vector<int> nums) {
29-
int cnt = 0;
30-
int n = nums.size();
31-
for (int i = 0; i < n; ++i) {
32-
if (isEvenBits(nums[i])) {
33-
cnt = i + 1;
34-
} else {
35-
for (int k = 0; k < i - cnt; ++k) {
36-
if (isEvenBits(nums[k] ^ nums[i])) {
37-
cnt = i - k - 1;
38-
break;
39-
}
40-
}
41-
}
42-
}
43-
return cnt;
44-
}
45-
46-
int main() {
29+
int main()
30+
{
4731
int T; cin >> T;
4832
for (int i = 1; i <= T; ++i) {
4933
int N, Q; cin >> N >> Q;
50-
vector<int> nums ( N );
5134

52-
for (int k = 0; k < N; ++k) cin >> nums[k];
53-
54-
vector<int> xors ( N, 0 );
55-
int mask = 0;
35+
vector<int> nums ( N );
36+
set<int> siOddBits; int tmp;
5637
for (int k = 0; k < N; ++k) {
57-
mask ^= nums[k];
58-
xors[k] = mask;
38+
cin >> tmp; nums[k] = tmp;
39+
if (!isEvenBits(tmp)) {
40+
siOddBits.insert(k);
41+
}
5942
}
6043

44+
int idx, val;
45+
bool bPrev, bNow;
6146
vector<int> ans ( Q );
47+
6248
for (int k = 0; k < Q; ++k) {
63-
int idx, val;
6449
cin >> idx >> val;
50+
bPrev = isEvenBits(nums[idx]);
51+
bNow = isEvenBits(val);
6552

66-
int m = (nums[idx] ^ val);
67-
nums[idx] = val;
68-
for (int j = idx; j < N; ++j) {
69-
xors[j] ^= m;
53+
if (bPrev && !bNow) {
54+
siOddBits.insert(idx);
55+
} else if (!bPrev && bNow) {
56+
siOddBits.erase(idx);
7057
}
7158

72-
ans[k] = countEvenBits(xors);
59+
int sz = siOddBits.size();
60+
if (sz % 2 == 0) {
61+
ans[k] = N;
62+
} else {
63+
ans[k] = max( *siOddBits.rbegin(), N - *siOddBits.begin() - 1 );
64+
}
65+
nums[idx] = val;
7366
}
7467

75-
cout << "Case #" << i << ": ";
68+
cout << "Case #" << i << ":";
7669
for (int k = 0; k < Q; ++k) {
77-
if (k != 0) cout << " ";
78-
cout << ans[k];
70+
cout << " " << ans[k];
7971
}
8072
cout << "\n";
8173
}

0 commit comments

Comments
 (0)