답안 #1009546

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1009546 2024-06-27T15:38:16 Z hahahoang132 XOR Sum (info1cup17_xorsum) C++17
100 / 100
783 ms 47304 KB
#include<bits/stdc++.h>
#define ll long long
#define task " "
using namespace std;
const ll N = 1e6 + 5;
const ll mod = 1e9 + 7;
#define bit(x,y) ((x >> y) & 1)
ll a[N],b[N];
pair<ll,int>  tmp[N],ntmp[N];
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    ll n;
    cin >> n;
    ll i,j;
    for(i = 1;i <= n;i++) cin >> a[i];
    ll ans =  0;
    for(ll id = 0;id <= 30;id++)
    {
        if(id == 0)
        {
            for(i = 1;i <= n;i++) tmp[i] = {(a[i] % (1LL << (id + 1))),i};
            sort(tmp + 1,tmp + 1 + n);
        }else
        {
            ll sus = 1;
            for(i = 1;i <= n;i++)
            {
                if(!bit(a[tmp[i].second],id))
                {
                    ntmp[sus++] = tmp[i];
                }
            }
            for(i = 1;i <= n;i++)
            {
                if(bit(a[tmp[i].second],id))
                {
                    ntmp[sus++] = {tmp[i].first ^ (1LL << id),tmp[i].second};
                }
            }
            swap(ntmp,tmp);
        }
        for(i = 1;i <= n;i++) b[i] = tmp[i].first;
        ll cnt = 0;
        ll l = n + 1,r = 0,s = n + 1;
        ll t1 = (1LL << id),t2 = (1LL << (id + 1));
        if(b[n - 1] + b[n] < t1) break;
        for(i = n;i >= 1;i--)
        {
            if(b[1] + b[i] >= t1) l = i;
            else break;
        }
        for(i = 1;i <= n;i++)
        {
            if(b[1] + b[i] < t2) r = i;
            else break;
        }
        for(i = n;i >= 1;i--)
        {
            if(t1 + t2 - b[1] <= b[i]) s = i;
            else break;
        }
        cnt += max(0LL,r - l + 1) + (n - s + 1);
        for(i = 2;i <= n;i++)
        {
            while(l - 1 >= 1 && b[i] + b[l - 1] >= t1) l--;
            while(b[i] + b[r] >= t2) r--;
            while(s >= 1 && t1 + t2 - b[i] <= b[s - 1]) s--;
            cnt += max(0LL,r - max(l,i) + 1) + (n - max(i,s) + 1);
        }
        if(cnt % 2 == 1) ans = ans ^ (1 << id);
    }
    cout << ans;
}

Compilation message

xorsum.cpp: In function 'int main()':
xorsum.cpp:16:10: warning: unused variable 'j' [-Wunused-variable]
   16 |     ll i,j;
      |          ^
# 결과 실행 시간 메모리 Grader output
1 Correct 70 ms 35500 KB Output is correct
2 Correct 83 ms 35508 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 386 ms 47292 KB Output is correct
2 Correct 403 ms 46168 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 386 ms 47292 KB Output is correct
2 Correct 403 ms 46168 KB Output is correct
3 Correct 684 ms 47276 KB Output is correct
4 Correct 582 ms 46676 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 70 ms 35500 KB Output is correct
2 Correct 83 ms 35508 KB Output is correct
3 Correct 163 ms 37556 KB Output is correct
4 Correct 139 ms 37556 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 70 ms 35500 KB Output is correct
2 Correct 83 ms 35508 KB Output is correct
3 Correct 386 ms 47292 KB Output is correct
4 Correct 403 ms 46168 KB Output is correct
5 Correct 684 ms 47276 KB Output is correct
6 Correct 582 ms 46676 KB Output is correct
7 Correct 163 ms 37556 KB Output is correct
8 Correct 139 ms 37556 KB Output is correct
9 Correct 783 ms 47304 KB Output is correct
10 Correct 770 ms 47188 KB Output is correct
11 Correct 754 ms 47304 KB Output is correct