Submission #499193

#TimeUsernameProblemLanguageResultExecution timeMemory
499193LucaIlieXOR Sum (info1cup17_xorsum)C++17
7 / 100
1691 ms126180 KiB
#include <iostream> #include <algorithm> #define MAX_N 1000000 #define MAX_LOG_A 29 using namespace std; int v[MAX_N], rest[MAX_LOG_A + 1][MAX_N]; int countLower( int v[], int n, int a ) { int st, dr, mij; st = 0; dr = n; while ( dr - st > 1 ) { mij = (st + dr) / 2; if ( v[mij] > a ) dr = mij; else st = mij; } if ( v[st] > a ) return 0; return st + 1; } int main() { int n, r, st, dr, nrSume, res, i, p; cin >> n; for ( i = 0; i < n; i++ ) { cin >> v[i]; for ( p = 0; p <= MAX_LOG_A; p++ ) rest[p][i] = v[i] & ((1 << (p + 1)) - 1); } res = 0; for ( p = 0; p <= MAX_LOG_A; p++ ) { sort( rest[p], rest[p] + n ); nrSume = 0; for ( i = 0; i < n; i++ ) { r = v[i] & ((1 << (p + 1)) - 1); st = (1 << p) - r; if ( st < 0 ) st += (1 << (p + 1)); dr = (1 << (p + 1)) - 1 - r; if ( dr < 0 ) dr += (1 << (p + 1)); if ( st <= dr ) { nrSume += countLower( rest[p], n, dr ) - countLower( rest[p], n, st - 1 ); if ( st <= r && r <= dr ) nrSume++; } else { nrSume += n - countLower( rest[p], n, st - 1 ) + countLower( rest[p], n, dr ); if ( st <= r || r <= dr ) nrSume++; } } nrSume /= 2; if ( nrSume % 2 == 1 ) res += (1 << p); } cout << res; return 0; }
#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...