제출 #1132293

#제출 시각아이디문제언어결과실행 시간메모리
1132293stdfloatIntergalactic ship (IZhO19_xorsum)C++20
100 / 100
1207 ms6028 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int Q = (int)1e5 + 1, md = (int)1e9 + 7; vector<int> pw(Q, 1); vector<vector<int>> dp; ll MD(ll x) { return (x % md + md) % md; } int f(bool x, bool y, int a, int b, int c) { if (~a) { if (!a) return f(x, y, -1, b, c); return MD((ll)pw[a - 1] * MD(f(x, y, -1, b, c) + f(!x, !y, -1, b, c))); } else if (~b) return MD((ll)(b ? pw[b - 1] : x) * f(true, y, -1, -1, c)); else return (c ? pw[c - 1] : y); } void ad(int a, int b, int c, int d) { dp[a][b]++; dp[c + 1][d + 1]++; dp[c + 1][b]--; dp[a][d + 1]--; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); for (int i = 1; i < Q; i++) pw[i] = MD(pw[i - 1] << 1); int n; cin >> n; vector<int> a(n + 1); for (int i = 1; i <= n; i++) cin >> a[i]; int q; cin >> q; vector<int> l(q + 1), r(q + 1), X(q + 1); for (int i = 1; i <= q; i++) cin >> l[i] >> r[i] >> X[i]; int ans = 0; for (int x = 0; x < 8; x++) { for (int y = 0; y < 8; y++) { dp.assign(n + 2, vector<int>(n + 2)); vector<vector<int>> p(n + 2, vector<int>(2)); for (int i = 1; i <= q; i++) { bool tr1 = (X[i] >> x) & 1, tr2 = (X[i] >> y) & 1; if (tr1) { p[l[i]][0]++; p[r[i] + 1][0]--; } if (tr2) { p[l[i]][1]++; p[r[i] + 1][1]--; } if (tr1 && tr2) ad(l[i], l[i], r[i], r[i]); } for (int i = 1; i <= n; i++) { p[i][0] += p[i - 1][0]; p[i][1] += p[i - 1][1]; for (int j = 1; j <= n; j++) dp[i][j] += dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1]; } for (int i = 1; i <= n; i++) { for (int j = i; j <= n; j++) { int A = dp[i][j], B = p[i][0] - dp[i][j], C = p[j][1] - dp[i][j]; int vl = MD((ll)(1 + (i != j)) * pw[x] * pw[y]); int pr = MD((ll)i * (n - j + 1)); int cnt = f((a[i] >> x) & 1, (a[j] >> y) & 1, A, B, C); ans = MD(ans + MD(MD(MD(vl * pr) * cnt) * pw[q - A - B - C])); } } } } cout << ans; }
#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...