結果
| 問題 |
No.1891 Static Xor Range Composite Query
|
| ユーザー |
SSRS
|
| 提出日時 | 2022-03-21 22:23:42 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 1,880 ms / 5,000 ms |
| コード長 | 2,131 bytes |
| コンパイル時間 | 2,560 ms |
| コンパイル使用メモリ | 200,388 KB |
| 最終ジャッジ日時 | 2025-01-28 10:56:46 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 30 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
const long long MOD = 998244353;
template <typename T>
struct segment_tree{
int N;
vector<vector<T>> ST;
function<T(T, T)> f;
T E;
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){
assert(x < ST[i].size());
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);
}
};
struct linear{
long long a, b;
linear(){
a = 1;
b = 0;
}
linear(int a, int b): a(a), b(b){
}
};
linear composite(linear A, linear B){
return linear(A.a * B.a % MOD, (A.b * B.a + B.b) % MOD);
}
int value(linear A, int x){
return (A.a * x + A.b) % MOD;
}
int main(){
int N, Q;
cin >> N >> Q;
vector<linear> f(N);
for (int i = 0; i < N; i++){
int a, b;
cin >> a >> b;
f[i] = linear(a, b);
}
segment_tree<linear> F(f, composite, linear());
for (int i = 0; i < Q; i++){
int l, r, p, x;
cin >> l >> r >> p >> x;
cout << value(F.range_fold(l, r, p), x) << endl;
}
}
SSRS