Submission #229819

#TimeUsernameProblemLanguageResultExecution timeMemory
229819534351Intergalactic ship (IZhO19_xorsum)C++17
45 / 100
1552 ms504 KiB
#include <bits/stdc++.h> using namespace std; template<class T, class U> void ckmin(T &a, U b) { if (a > b) a = b; } template<class T, class U> void ckmax(T &a, U b) { if (a < b) a = b; } #define MP make_pair #define PB push_back #define LB lower_bound #define UB upper_bound #define fi first #define se second #define SZ(x) ((int) (x).size()) #define ALL(x) (x).begin(), (x).end() #define FOR(i, a, b) for (auto i = (a); i < (b); i++) #define FORD(i, a, b) for (auto i = (a) - 1; i >= (b); i--) typedef long long ll; typedef long double ld; typedef pair<int, int> pii; typedef pair<ll, ll> pll; typedef vector<int> vi; typedef vector<ll> vl; typedef vector<pii> vpi; typedef vector<pll> vpl; const int MAXN = 1013; const int MAXV = 129; const int MAXQ = 100013; const int INF = 1000000007; const int HALF = (INF + 1) >> 1; int add(int a, int b) { a += b; if (a >= INF) a -= INF; return a; } int mul(int a, int b) { return (ll) a * b % INF; } int sub(int a, int b) { a -= b; if (a < 0) a += INF; return a; } int pwr(int a, int b) { int res = 1; while(b > 0) { if (b & 1) res = mul(res, a); b >>= 1; a = mul(a, a); } return res; } int inv(int a) { return pwr(a, INF - 2); } int dvd(int a, int b) { return mul(a, inv(b)); } int N, Q, V; int arr[MAXN]; pair<pii, int> query[MAXN]; vi st[MAXN], en[MAXN]; int lt[MAXV], both[MAXV], rt[MAXV]; int ans; int calc(int x, int y) { vi lb, mb, rb; FORD(i, V, 0) { if (lt[i]) { int w = i; for (int x : lb) ckmin(w, w ^ x); if (w) lb.PB(w); } if (both[i]) { int w = i; for (int x : mb) ckmin(w, w ^ x); if (w) mb.PB(w); } if (rt[i]) { int w = i; for (int x : rb) ckmin(w, w ^ x); if (w) rb.PB(w); } } // for (int x : mb) // { // cerr << x << ' '; // } // cerr << endl; int res = 0; FOR(i, 0, (1 << SZ(mb))) { int el = 0, er = 0; int val = 0; FOR(j, 0, SZ(mb)) { if (!(i & (1 << j))) continue; val ^= mb[j]; } FOR(j, 0, (1 << SZ(lb))) { int val1 = 0; FOR(k, 0, SZ(lb)) { if (!(j & (1 << k))) continue; val1 ^= lb[k]; } el = add(el, x ^ val ^ val1); } FOR(j, 0, (1 << SZ(rb))) { int val1 = 0; FOR(k, 0, SZ(rb)) { if (!(j & (1 << k))) continue; val1 ^= rb[k]; } er = add(er, y ^ val ^ val1); } int p = pwr(HALF, SZ(mb) + SZ(lb) + SZ(rb)); res = add(res, mul(mul(el, er), p)); //it } // cerr << "result " << res << endl; return res; } int32_t main() { cout << fixed << setprecision(12); cerr << fixed << setprecision(4); ios_base::sync_with_stdio(false); cin.tie(0); cin >> N; FOR(i, 0, N) { cin >> arr[i]; ckmax(V, arr[i]); } cin >> Q; FOR(i, 0, Q) { int l, r, x; cin >> l >> r >> x; l--; r--; query[i] = {{l, r}, x}; ckmax(V, x); st[l].PB(i); en[r].PB(i); } if (V == 0) { cout << "0\n"; return 0; } V = (1 << (32 - __builtin_clz(V - 1))); // cerr << "V = " << V << endl; //the last bit probably has smth to do w the fact that you only care about 7 vectors because basis blah blah blah crap. FOR(i, 0, N) { fill(lt, lt + V, 0); fill(both, both + V, 0); fill(rt, rt + V, 0); //it affects left only, both FOR(j, 0, Q) { if (query[j].fi.fi <= i && query[j].fi.se >= i) { both[query[j].se]++; } } int co = mul(i + 1, N - i); // cerr << "solve " << i << ' ' << i << endl; ans = add(ans, mul(co, calc(arr[i], arr[i]))); FOR(j, i + 1, N) { for (int q : en[j - 1]) { if (query[q].fi.fi <= i) { both[query[q].se]--; lt[query[q].se]++; } else { rt[query[q].se]--; } } for (int q : st[j]) { rt[query[q].se]++; } co = mul(2, mul(i + 1, N - j)); // cerr << "solve " << i << ' ' << j << " co = " << co << endl; ans = add(ans, mul(co, calc(arr[i], arr[j]))); } } // cerr << "ans == " << ans << endl; FOR(i, 0, Q) { ans = add(ans, ans); } cout << ans << '\n'; 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...