結果
問題 | No.2265 Xor Range Substring Sum Query |
ユーザー |
![]() |
提出日時 | 2023-04-04 20:00:41 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,892 bytes |
コンパイル時間 | 2,204 ms |
コンパイル使用メモリ | 184,444 KB |
実行使用メモリ | 305,100 KB |
最終ジャッジ日時 | 2024-10-01 10:38:03 |
合計ジャッジ時間 | 9,354 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 2 TLE * 1 -- * 19 |
ソースコード
#include <bits/stdc++.h>using namespace std;const long long MOD = 998244353;struct node{long long x, p2, p11;node(): x(0), p2(1), p11(1){}node(int x): x(x), p2(2), p11(11){}};node op(node L, node R){node ans;ans.x = (L.x * R.p11 + L.p2 * R.x) % MOD;ans.p2 = L.p2 * R.p2 % MOD;ans.p11 = L.p11 * R.p11 % MOD;return ans;}template <typename T>struct xor_segment_tree{int N;vector<vector<T>> ST;function<T(T, T)> f;T E;xor_segment_tree(vector<T> &A, function<T(T, T)> f, T E): f(f), E(E){N = A.size();ST = vector<vector<T>>(N * 2 - 1);for (int i = 0; i < N; i++){ST[N - 1 + i].push_back(A[i]);}for (int i = N - 2; i >= 0; i--){int cnt = ST[i * 2 + 1].size();for (int j = 0; j < cnt; j++){ST[i].push_back(f(ST[i * 2 + 1][j], ST[i * 2 + 2][j]));}for (int j = 0; j < cnt; j++){ST[i].push_back(f(ST[i * 2 + 2][j], ST[i * 2 + 1][j]));}}}T range_fold(int L, int R, int x, int i, int l, int r){if (r <= L || R <= l){return E;} else if (L <= l && r <= R){return ST[i][x];} else {int p = (r - l) / 2;int m = (l + r) / 2;if ((x & p) == 0){T resL = range_fold(L, R, x, i * 2 + 1, l, m);T resR = range_fold(L, R, x, i * 2 + 2, m, r);return f(resL, resR);} else {T resL = E;if (R >= m){resL = range_fold(max(L, m) - p, R - p, x ^ p, i * 2 + 1, l, m);}T resR = E;if (L < m){resR = range_fold(L + p, min(R, m) + p, x ^ p, i * 2 + 2, m, r);}return f(resR, resL);}}}T range_fold(int L, int R, int x){return range_fold(L, R, x, 0, 0, N);}};int main(){int n;cin >> n;string S;cin >> S;vector<node> A(1 << n);for (int i = 0; i < (1 << n); i++){A[i] = node(S[i] - '0');}int Q;cin >> Q;vector<int> pos;xor_segment_tree<node> ST(A, op, node());for (int i = 0; i < Q; i++){int t;cin >> t;if (t == 1){int x, y;cin >> x >> y;A[x] = node(y);pos.push_back(x);}if (t == 2){int L, R, X;cin >> L >> R >> X;R++;vector<int> pos2 = {L - 1, R};for (int j : pos){if (L <= (j ^ X) && (j ^ X) < R){pos2.push_back(j ^ X);}}sort(pos2.begin(), pos2.end());pos2.erase(unique(pos2.begin(), pos2.end()), pos2.end());int cnt2 = pos2.size() - 1;node ans;for (int j = 0; j < cnt2; j++){ans = op(ans, ST.range_fold(pos2[j] + 1, pos2[j + 1], X));if (j < cnt2 - 1){ans = op(ans, A[pos2[j + 1] ^ X]);}}cout << ans.x << endl;}if (pos.size() == (1 << (n / 2))){ST = xor_segment_tree<node>(A, op, node());pos.clear();}}}