답안 #68032

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
68032 2018-08-15T19:33:00 Z top34051 XOR Sum (info1cup17_xorsum) C++17
77 / 100
1262 ms 38544 KB
#include<bits/stdc++.h>
using namespace std;

#define X first
#define Y second
const int maxn = 1e6 + 5;
const int mlog = 28;

int n;
int a[maxn];

int main() {
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);

	int ans = 0;

	vector<pair<int,int>> b[2];
	for(int i=1;i<=n;i++) b[0].push_back({0,a[i]});

	for(int i=0;i<=mlog;i++) {
		int pw = (1<<i);

//		printf("pw = %d\n",pw);

		vector<pair<int,int>> tmp[2];
		for(auto t : b[0]) {
            int x = t.second;
            tmp[(x/pw)%2].push_back({x%pw,x});
		}
		for(auto t : b[1]) {
            int x = t.second;
            tmp[(x/pw)%2].push_back({x%pw,x});
		}
		b[0] = tmp[0];
		b[1] = tmp[1];
		int sz0 = b[0].size();
		int sz1 = b[1].size();

//        printf("\t");
//		for(auto t : b[0]) printf("%d ",t);
//		printf("\n");
//        printf("\t");
//		for(auto t : b[1]) printf("%d ",t);
//		printf("\n");

		int cnt1 = 0, cnt2 = 0, cnt3 = 0;

		//tx = 0 ty = 0
		//2^i <= b[x] + b[y] (< 2^(i+1))
		for(int x=0,y=sz0;x<sz0;x++) {
			while(y-1 >= 0 && pw <= b[0][x].X + b[0][y-1].X) y--;
			cnt1 += sz0-y;
		}
		for(auto t : b[0]) if(pw <= t.X*2) cnt1++;
		cnt1 /= 2;

		//tx = 0 ty = 1
		//b[x] + b[y] < 2^i
		for(int x=sz0-1,y=-1;x>=0;x--) {
			while(y+1 < sz1 && b[0][x].X + b[1][y+1].X < pw) y++;
			cnt2 += y+1;
		}

		//tx = 1 ty = 1
		//2^i <= b[x] + b[y] (< 2^(i+1))
		for(int x=0,y=sz1;x<sz1;x++) {
			while(y-1 >= 0 && pw <= b[1][x].X + b[1][y-1].X) y--;
			cnt3 += sz1-y;
		}
		for(auto t : b[1]) if(pw <= t.X*2) cnt3++;
		cnt3 /= 2;

		if((cnt1+cnt2+cnt3)&1) ans += pw;
	}

	printf("%d",ans);
}

Compilation message

xorsum.cpp: In function 'int main()':
xorsum.cpp:13:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d",&n);
  ~~~~~^~~~~~~~~
xorsum.cpp:14:29: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  for(int i=1;i<=n;i++) scanf("%d",&a[i]);
                        ~~~~~^~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 380 KB Output is correct
2 Correct 8 ms 484 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1110 ms 35932 KB Output is correct
2 Correct 851 ms 35932 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1110 ms 35932 KB Output is correct
2 Correct 851 ms 35932 KB Output is correct
3 Correct 1006 ms 36184 KB Output is correct
4 Correct 1056 ms 36184 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 380 KB Output is correct
2 Correct 8 ms 484 KB Output is correct
3 Correct 97 ms 36184 KB Output is correct
4 Correct 127 ms 36184 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 380 KB Output is correct
2 Correct 8 ms 484 KB Output is correct
3 Correct 1110 ms 35932 KB Output is correct
4 Correct 851 ms 35932 KB Output is correct
5 Correct 1006 ms 36184 KB Output is correct
6 Correct 1056 ms 36184 KB Output is correct
7 Correct 97 ms 36184 KB Output is correct
8 Correct 127 ms 36184 KB Output is correct
9 Correct 1262 ms 36360 KB Output is correct
10 Correct 1139 ms 36988 KB Output is correct
11 Incorrect 1153 ms 38544 KB Output isn't correct