Submission #342356

#TimeUsernameProblemLanguageResultExecution timeMemory
342356kekwIntergalactic ship (IZhO19_xorsum)C++17
100 / 100
864 ms14956 KiB
#pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,fma") #include <bits/stdc++.h> //#include <ext/pb_ds/assoc_container.hpp> #define range(i, n) for (int i = 0; i < (n); ++i) #define ar array #define all(a) (a).begin(), (a).end() #define rall(a) (a).rbegin(), (a).rend() typedef long long ll; typedef long double ld; using namespace std; //using namespace __gnu_pbds; const ll INF = 1e18 + 5; const int INFi = 1e9; const int maxN = 1e5 + 1500; const int md2 = 998244353; const int md = 1e9 + 7; int add(int a, int b) { if (a + b >= md) return a + b - md; return a + b; } int sub(int a, int b) { if (a - b < 0) return a - b + md; return a - b; } int mul(int a, int b) { return (1ll * a * b) % md; } int st2[100001]; int a[1000]; int b[100000][3]; int Cnt[3][1005][1005]; void solve() { int n; cin >> n; range(i, n) cin >> a[i]; int q; cin >> q; st2[0] = 1; for (int i = 1; i <= q; ++i) st2[i] = mul(st2[i - 1], 2); range(i, q) range(j, 3) cin >> b[i][j]; int ans = 0; range(b1, 8) { range(b2, 8) { int result = 0; range(i, n) range(e, 3) memset(Cnt[e][i], 0, sizeof(Cnt[e][i])); auto ADD = [&](int x1, int y1, int x2, int y2, int m) { Cnt[m][x1][y1] += 1; Cnt[m][x2 + 1][y2 + 1] += 1; Cnt[m][x1][y2 + 1] -= 1; Cnt[m][x2 + 1][y1] -= 1; }; range(i, q) { int l = b[i][0]; int r = b[i][1]; int x = b[i][2]; if ((x & (1 << b1)) && (x & (1 << b2))) { ADD(l - 1, l - 1, r - 1, r - 1, 0); ADD(l - 1, r, r - 1, n, 1); if (l != 1) ADD(0, l - 1, l - 2, r - 1, 2); } else if (x & (1 << b1)) { ADD(l - 1, 0, r - 1, n, 1); } else if (x & (1 << b2)) { ADD(0, l - 1, n, r - 1, 2); } } range(i, n) { range(j, n) { range(e, 3) { if (i) Cnt[e][i][j] += Cnt[e][i - 1][j]; if (j) Cnt[e][i][j] += Cnt[e][i][j - 1]; if (i && j) Cnt[e][i][j] -= Cnt[e][i - 1][j - 1]; } } } range(i, n) { for (int j = i; j < n; ++j) { int cur = 0; if (Cnt[1][i][j] && Cnt[2][i][j]) { cur = st2[q - 2]; } else if (Cnt[1][i][j] && Cnt[0][i][j]) { cur = st2[q - 2]; } else if (Cnt[2][i][j] && Cnt[0][i][j]) { cur = st2[q - 2]; } else if (Cnt[1][i][j]) { if (a[j] & (1 << b2)) { cur = st2[q - 1]; } } else if (Cnt[2][i][j]) { if (a[i] & (1 << b1)) { cur = st2[q - 1]; } } else if (Cnt[0][i][j]) { int A = (a[i] >> b1) & 1; int B = (a[j] >> b2) & 1; if (A == B) { cur = st2[q - 1]; } } else if (((a[i] >> b1) & 1) && ((a[j] >> b2) & 1)) { cur = st2[q]; } result = add(result, mul(1 + (i != j), mul(cur, mul(i + 1, n - j)))); } } ans = add(ans, mul(result, 1 << (b1 + b2))); } } cout << ans << '\n'; } int main() { ios::sync_with_stdio(false); cin.tie(0); // cout << setprecision(15) << fixed; int tests = 1; //cin >> tests; range(_, tests) { solve(); } 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...