Submission #499217

#TimeUsernameProblemLanguageResultExecution timeMemory
499217LucaIlieXOR Sum (info1cup17_xorsum)C++17
0 / 100
751 ms8096 KiB
#include <iostream> #include <algorithm> #include <math.h> #define MAX_N 1000000 using namespace std; int v[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, maxLog2, st, dr, leftR, rightR, res, i, 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 = 0; p <= maxLog2 + 1; p++ ) { 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 = 0; i < n; 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 == n ) st--; if ( dr == n ) dr--; } 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...