Submission #499263

#TimeUsernameProblemLanguageResultExecution timeMemory
499263LucaIlieXOR Sum (info1cup17_xorsum)C++17
100 / 100
993 ms21456 KiB
#include <iostream> #include <algorithm> #include <math.h> #define MAX_N 1000000 using namespace std; int v[MAX_N], ant[MAX_N], rest[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, m, maxLog2, st, dr, leftR, rightR, res, i, j, p; long long nrSume; cin >> n; maxLog2 = 0; for ( i = 0; i < n; i++ ) { cin >> v[i]; if ( log2( v[i] ) > maxLog2 ) maxLog2 = log2( v[i] ); } res = 0; for ( p = maxLog2 + 1; p >= 0; p-- ) { if ( p <= maxLog2 ) { j = 0; while ( j < n && rest[j] < (1 << (p + 1)) ) j++; m = j; i = 0; while ( i < m && j < n ) { if ( ant[i] < ant[j] - (1 << (p + 1)) ) { rest[i + j - m] = ant[i]; i++; } else { rest[i + j - m] = ant[j] - (1 << (p + 1)); j++; } } while ( i < m ) { rest[n - m + i] = ant[i]; i++; } while ( j < n ) { rest[j] = ant[j] - (1 << (p + 1)); j++; } } else { for ( i = 0; i < n; i++ ) rest[i] = v[i] & ((1 << (p + 1)) - 1); sort( rest, rest + n ); } nrSume = 0; st = dr = 0; for ( i = n - 1; i >= 0; i-- ) { leftR = (1 << p) - rest[i]; if ( leftR < 0 ) leftR += (1 << (p + 1)); rightR = (1 << (p + 1)) - 1 - rest[i]; if ( rightR < 0 ) rightR += (1 << (p + 1)); if ( rest[st] > leftR ) st = 0; while ( st < n && rest[st] < leftR ) st++; if ( rest[dr] > rightR ) dr = 0; while ( dr < n && rest[dr] <= rightR ) dr++; if ( leftR <= rightR ) { nrSume += dr - st; if ( leftR <= rest[i] && rest[i] <= rightR ) nrSume++; } else { nrSume += n - st + dr; if ( leftR <= rest[i] || rest[i] <= rightR ) nrSume++; } if ( st > 0 ) st--; if ( dr > 0 ) dr--; } nrSume /= 2; if ( nrSume % 2 == 1 ) res += (1 << p); for ( i = 0; i < n; i++ ) ant[i] = rest[i]; } 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...