Submission #146180

#TimeUsernameProblemLanguageResultExecution timeMemory
146180imeimi2000Intergalactic ship (IZhO19_xorsum)C++17
100 / 100
982 ms6996 KiB
#include <iostream> #include <algorithm> #include <vector> using namespace std; typedef long long llong; const int mod = 1e9 + 7; int n, q; int A[1001]; struct _qs { int l, r, x; void scan() { cin >> l >> r >> x; } } qs[100000]; int P2[100001]; int cnt[1001][1001]; int S[7][1002]; int solve(int a, int b) { for (int i = 1; i <= n; ++i) { for (int j = 1; j <= i; ++j) { cnt[j][i] = 0; } } for (int it = 0; it < q; ++it) { _qs i = qs[it]; bool b1 = (i.x >> a) & 1, b2 = (i.x >> b) & 1; if (!b1 || !b2) continue; ++cnt[i.l][i.r]; } for (int l = 1; l <= n; ++l) { for (int r = n - 1; l <= r; --r) { cnt[l][r] = (cnt[l][r] + cnt[l][r + 1]) % mod; } } for (int l = 2; l <= n; ++l) { for (int r = n; l <= r; --r) { cnt[l][r] = (cnt[l][r] + cnt[l - 1][r]) % mod; } } llong ret = 0; for (int l = 1; l <= n; ++l) { for (int r = 1; r <= n; ++r) { if (l > r) cnt[l][r] = cnt[r][l]; llong C[2][2] = {}; C[1][1] = cnt[l][r]; C[1][0] = S[a][l] - C[1][1]; C[0][1] = S[b][r] - C[1][1]; C[0][0] = q - C[0][1] - C[1][0] - C[1][1]; llong sum = 0; int x = (A[l] >> a) & 1; x ^= 1; int y = (A[r] >> b) & 1; y ^= 1; int v = q; for (int i = 0; i < 2; ++i) { for (int j = 0; j < 2; ++j) { if (i == 0 && j == 0) continue; if (C[i][j] > 0) --v; } } v = P2[v]; for (int i = 0; i < 2; ++i) { int k = i ^ x; int j = k ^ y; if (C[1][0] < i) continue; if (C[0][1] < j) continue; if (C[1][1] < k) continue; sum += v; } v = (n - max(l, r) + 1) * min(l, r); ret += (sum << a + b) % mod * v; ret %= mod; } } if (a != b) ret = (ret << 1) % mod; return ret; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n; for (int i = 1; i <= n; ++i) { cin >> A[i]; } cin >> q; P2[0] = 1; for (int i = 0; i < q; ++i) { qs[i].scan(); P2[i + 1] = (P2[i] << 1) % mod; for (int j = 0; j < 7; ++j) { if ((qs[i].x >> j) & 1) { ++S[j][qs[i].l]; --S[j][qs[i].r + 1]; } } } for (int j = 0; j < 7; ++j) { for (int i = 1; i <= n; ++i) { S[j][i] += S[j][i - 1]; } } llong ans = 0; for (int i = 0; i < 7; ++i) { for (int j = 0; j <= i; ++j) { ans += solve(j, i); } } printf("%lld\n", ans % mod); return 0; }

Compilation message (stderr)

xorsum.cpp: In function 'int solve(int, int)':
xorsum.cpp:73:30: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
             ret += (sum << a + b) % mod * v;
                            ~~^~~
#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...