結果
| 問題 |
No.1891 Static Xor Range Composite Query
|
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 15:16:06 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,629 bytes |
| コンパイル時間 | 392 ms |
| コンパイル使用メモリ | 82,432 KB |
| 実行使用メモリ | 177,484 KB |
| 最終ジャッジ日時 | 2025-06-12 15:16:32 |
| 合計ジャッジ時間 | 9,342 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 20 TLE * 1 -- * 9 |
ソースコード
import sys
MOD = 998244353
def main():
sys.setrecursionlimit(1 << 25)
N, Q = map(int, sys.stdin.readline().split())
a_list = []
b_list = []
for _ in range(N):
a, b = map(int, sys.stdin.readline().split())
a_list.append(a % MOD)
b_list.append(b % MOD)
queries = []
for _ in range(Q):
l, r, p, x = map(int, sys.stdin.readline().split())
queries.append((l, r, p, x))
# 线段树节点结构
class SegmentTreeNode:
__slots__ = ['start', 'end', 'a', 'b', 'left', 'right']
def __init__(self, start, end):
self.start = start
self.end = end
self.a = 0
self.b = 0
self.left = None
self.right = None
def build(start, end):
node = SegmentTreeNode(start, end)
if start + 1 == end:
node.a = a_list[start]
node.b = b_list[start]
return node
mid = (start + end) // 2
node.left = build(start, mid)
node.right = build(mid, end)
# 父节点的函数是 left_func o right_func
# a = left.a * right.a
# b = left.a * right.b + left.b
node.a = (node.left.a * node.right.a) % MOD
node.b = (node.left.a * node.right.b + node.left.b) % MOD
return node
root = build(0, N)
def query_range(node, l, r):
if node.end <= l or node.start >= r:
return (1, 0)
if l <= node.start and node.end <= r:
return (node.a, node.b)
left_a, left_b = query_range(node.left, l, r)
right_a, right_b = query_range(node.right, l, r)
# 合并 right_func o left_func
if (left_a, left_b) == (1, 0) and (right_a, right_b) == (1, 0):
return (1, 0)
if (left_a, left_b) == (1, 0):
return (right_a, right_b)
if (right_a, right_b) == (1, 0):
return (left_a, left_b)
a = (right_a * left_a) % MOD
b = (right_a * left_b + right_b) % MOD
return (a, b)
for l, r, p, x in queries:
# 确定实际的区间
a = 0
b = 0
current_a, current_b = 1, 0
for k in range(l, r):
idx = (k ^ p)
if idx < 0 or idx >= N:
continue
# current_func = f[idx] o current_func
new_a = (a_list[idx] * current_a) % MOD
new_b = (a_list[idx] * current_b + b_list[idx]) % MOD
current_a, current_b = new_a, new_b
res = (current_a * x + current_b) % MOD
print(res)
return
if __name__ == "__main__":
main()
gew1fw