제출 #1158232

#제출 시각아이디문제언어결과실행 시간메모리
1158232itaykarnyXOR Sum (info1cup17_xorsum)C++20
0 / 100
1522 ms25684 KiB
#include<iostream>
#include<vector>
#include<algorithm>
#include<set>
#include<map>
#include<queue>
#include<string>
#include<math.h>



using namespace std;
using ll = long long;
using vll = vector<ll>;
using vvll = vector<vll>;
using pll = pair<ll, ll>;
using vpll = vector<pair<ll, ll>>;
using vvpll = vector<vpll>;


int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	ll n;
	cin >> n;
	vll arr(n);
	for (ll i = 0; i < n; i++) cin >> arr[i];
	ll ans = 0;
	for (ll b = 0; b < 29; b++) {
		// Look at the first b bits
		vll cur0; // Keep all the numbers that have 0 in the b bit with only their first b-1 bits
		vll cur1; // Keep all the numbers that have 1 in the b bit with only their first b-1 bits
		ll A = (1LL << (b)) - 1;
		for (ll i = 0; i < n; i++) {
			if ((arr[i] >> b) & (ll)1) cur1.push_back(arr[i] & A);
			else cur0.push_back(arr[i] & A);
		}
		sort(cur0.begin(), cur0.end());
		sort(cur1.begin(), cur1.end());
		long long res = 0;
		ll carry = (ll)1 << b;
		ll pos = 0;
		ll pos1 = cur0.size() - 1;
		ll t = 0;
		for (ll j = cur0.size() - 1; j >= 0; j--) {
			for (; pos < cur1.size(); pos++) {
				if (cur0[j] + cur1[pos] >= carry) { break; }
			}
			res += pos;
			for (; pos1 >= 0; pos1--) {
				if (cur0[j] + cur0[pos1] < carry) { break; }
			}
			t += cur0.size() - pos1 - 1;
		}
		pos = cur1.size() - 1;
		for (ll j = 0; j < cur1.size(); j++) {
			for (; pos >= 0; pos--) {
				if (cur1[j] + cur1[pos] < carry) { break; }
			}
			t += cur1.size() - pos - 1;
		}
		for (ll i = 0; i < n; i++) {
			if (((2 * arr[i]) >> b) & 1) { t++; }
		}
		res += t / 2;
		ans += (res % 2) * carry;
	}
	cout << ans << endl;
}
#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...