Submission #1322763

#TimeUsernameProblemLanguageResultExecution timeMemory
1322763Jawad_Akbar_JJXOR Sum (info1cup17_xorsum)C++20
56 / 100
1695 ms20032 KiB
#include <iostream>
#include <algorithm>

using namespace std;
const int N = 1<<20;
int ord[N], ord2[N], a[N], b[N], cnt[N], c[N];

int bin(int l, int r, int vl){
	while (l + 1 < r){
		int mid = (l + r) >> 1;
		if (/*b[ord[mid]]*/c[mid] >= vl)
			r = mid;
		else
			l = mid;
	}
	return r;
}

void solve(int n, int k){
	int z = 0;
	for (int i=1;i<=n;i++){
		if ((1<<k) & a[i])
			b[i] += (1<<k);
		else
			z++;
		swap(ord[i], ord2[i]);
	}


	for (int i=1, O = 0, Z = 0;i<=n;i++){
		if (b[ord2[i]] & (1<<k))
			O++, ord[z + O] = ord2[i];
		else
			Z++, ord[Z] = ord2[i];
	}
	for (int i=1;i<=n;i++){
		c[i] = b[ord[i]];
		// cout<<c[i]<<" ";
	}
	// cout<<'\n';

	for (int i=1;i<=n;i++){
		int B = b[ord[i]];
		// int l1 = bin(i-1, n+1, (1<<k) - B);
		// int r1 = bin(i-1, n+1, (2<<k) - B);
		// int l2 = bin(i-1, n+1, (1<<k) + (2<<k) - B);

		int l1 = upper_bound(c + i, c + n + 1, (1<<k) - B - 1) - c;
		int r1 = upper_bound(c + i, c + n + 1, (2<<k) - B - 1) - c;
		int l2 = upper_bound(c + i, c + n + 1, (1<<k) + (2<<k) - B - 1) - c;

		cnt[k] += n + 1 - l2;
		cnt[k] += r1 - l1;
	}
}

int main(){
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	int n, Ans = 0, ln = 0;
	cin>>n;

	for (int i=1;i<=n;i++)
		cin>>a[i], ord[i] = i, ln = max(ln, 31 - __builtin_clz(a[i]));

	// cout<<ln<<'\n';
	for (int i=0;i<=ln+1;i++)
		solve(n, i);

	for (int i=0;i<=ln+1;i++)
		Ans += (1<<i) * (cnt[i] & 1);
	cout<<Ans<<'\n';
}
#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...