제출 #1139817

#제출 시각아이디문제언어결과실행 시간메모리
1139817stdfloatXOR Sum (info1cup17_xorsum)C++20
100 / 100
522 ms17968 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

#define sz(v)	(int)(v).size()
#define all(v)	(v).begin(), (v).end()

int big(vector<int>& v, vector<int>& u, int K, bool tr) {
	int ans = 0;
	int r = sz(u) - 1;
	for (int i = 0; i < sz(v); i++) {
		while (0 <= r && v[i] + u[r] >= K) r--;

		ans += sz(u) - max((tr ? i - 1 : INT_MIN), r) - 1;
	}

	return ans;
}

int sml(vector<int>&v, vector<int>&u, int K) {
	return sz(v) * sz(u) - big(v, u, K, false);
}

int main() {
	ios::sync_with_stdio(false); cin.tie(nullptr);

	int n;
	cin >> n;

	vector<int> a(n);
	for (auto &i : a)
		cin >> i;

	int ans = 0;
	for (int k = 0; k < 31; k++) {
		int K = 1 << k;
		vector<int> zr, one;
		for (int i = 0; i < n; i++)
			(a[i] >> k & 1 ? one : zr).push_back(i);

		vector<int> b = zr;
		b.insert(b.end(), all(one));

		for (auto &i : zr)
			i = a[i] % K;
		for (auto &i : one)
			i = a[i] % K;
		for (auto &i : b)
			i = a[i];

		a = b;

		int x = big(zr, zr, K, true), y = big(one, one, K, true), z = sml(zr, one, K);

		if ((x + y + z) & 1) ans ^= K;
	}

	cout << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...