Submission #141204

#TimeUsernameProblemLanguageResultExecution timeMemory
141204meatrowXOR Sum (info1cup17_xorsum)C++17
100 / 100
650 ms11160 KiB
#pragma GCC optimize("Ofast") #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,tune=native") //#pragma GCC optimize ("unroll-loops") #include <bits/stdc++.h> using namespace std; /** Interface */ inline int readChar(); template <class T = int> inline T readInt(); template <class T> inline void writeInt( T x, char end = 0 ); inline void writeChar( int x ); inline void writeWord( const char *s ); /** Read */ static const int buf_size = 4096; inline int getChar() { static char buf[buf_size]; static int len = 0, pos = 0; if (pos == len) pos = 0, len = fread(buf, 1, buf_size, stdin); if (pos == len) return -1; return buf[pos++]; } inline int readChar() { int c = getChar(); while (c <= 32) c = getChar(); return c; } template <class T> inline T readInt() { int s = 1, c = readChar(); T x = 0; if (c == '-') s = -1, c = getChar(); while ('0' <= c && c <= '9') x = x * 10 + c - '0', c = getChar(); return s == 1 ? x : -x; } /** Write */ static int write_pos = 0; static char write_buf[buf_size]; inline void writeChar( int x ) { if (write_pos == buf_size) fwrite(write_buf, 1, buf_size, stdout), write_pos = 0; write_buf[write_pos++] = x; } template <class T> inline void writeInt( T x, char end ) { if (x < 0) writeChar('-'), x = -x; char s[24]; int n = 0; while (x || !n) s[n++] = '0' + x % 10, x /= 10; while (n--) writeChar(s[n]); if (end) writeChar(end); } inline void writeWord( const char *s ) { while (*s) writeChar(*s++); } struct Flusher { ~Flusher() { if (write_pos) fwrite(write_buf, 1, write_pos, stdout), write_pos = 0; } } flusher; using ll = long long; using ld = long double; const int M = 30; const int N = 1e6; int a[N]; int k[2]; int y[2][N]; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int n = readInt(); for (int i = 0; i < n; i++) { a[i] = readInt(); } int ans = 0; int pw = 1; for (int b = 0; b < M; b++) { int q = (pw << 1) - 1; int kek = 0; k[0] = k[1] = 0; for (int i = 0; i < n; i++) { y[(a[i] >> b) & 1][k[(a[i] >> b) & 1]++] = a[i]; } int p = 0; for (int i = 0; i < 2; i++) { memcpy(a + p, y[i], sizeof(int) * k[i]); p += k[i]; } int it1 = n - 1; int it2 = n - 1; int it3 = n - 1; for (int i = 0; i < n; i++) { int t = a[i] & q; while (it1 >= 0 && (a[it1] & q) >= pw - t) { it1--; } while (it2 >= 0 && (a[it2] & q) > q - t) { it2--; } while (it3 >= 0 && (a[it3] & q) >= 3 * pw - t) { it3--; } (kek += max(0, min(it2, i) - it1)) &= 1; if (t & pw) { (kek += max(0, i - it3)) &= 1; } } if (kek) { ans += pw; } pw <<= 1; } writeInt(ans); 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...