제출 #1322763

#제출 시각아이디문제언어결과실행 시간메모리
1322763Jawad_Akbar_JJXOR Sum (info1cup17_xorsum)C++20
56 / 100
1695 ms20032 KiB
#include <iostream> #include <algorithm> using namespace std; const int N = 1<<20; int ord[N], ord2[N], a[N], b[N], cnt[N], c[N]; int bin(int l, int r, int vl){ while (l + 1 < r){ int mid = (l + r) >> 1; if (/*b[ord[mid]]*/c[mid] >= vl) r = mid; else l = mid; } return r; } void solve(int n, int k){ int z = 0; for (int i=1;i<=n;i++){ if ((1<<k) & a[i]) b[i] += (1<<k); else z++; swap(ord[i], ord2[i]); } for (int i=1, O = 0, Z = 0;i<=n;i++){ if (b[ord2[i]] & (1<<k)) O++, ord[z + O] = ord2[i]; else Z++, ord[Z] = ord2[i]; } for (int i=1;i<=n;i++){ c[i] = b[ord[i]]; // cout<<c[i]<<" "; } // cout<<'\n'; for (int i=1;i<=n;i++){ int B = b[ord[i]]; // int l1 = bin(i-1, n+1, (1<<k) - B); // int r1 = bin(i-1, n+1, (2<<k) - B); // int l2 = bin(i-1, n+1, (1<<k) + (2<<k) - B); int l1 = upper_bound(c + i, c + n + 1, (1<<k) - B - 1) - c; int r1 = upper_bound(c + i, c + n + 1, (2<<k) - B - 1) - c; int l2 = upper_bound(c + i, c + n + 1, (1<<k) + (2<<k) - B - 1) - c; cnt[k] += n + 1 - l2; cnt[k] += r1 - l1; } } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); int n, Ans = 0, ln = 0; cin>>n; for (int i=1;i<=n;i++) cin>>a[i], ord[i] = i, ln = max(ln, 31 - __builtin_clz(a[i])); // cout<<ln<<'\n'; for (int i=0;i<=ln+1;i++) solve(n, i); for (int i=0;i<=ln+1;i++) Ans += (1<<i) * (cnt[i] & 1); cout<<Ans<<'\n'; }
#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...