結果
問題 |
No.510 二次漸化式
|
ユーザー |
![]() |
提出日時 | 2025-06-12 13:16:16 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,384 bytes |
コンパイル時間 | 326 ms |
コンパイル使用メモリ | 82,596 KB |
実行使用メモリ | 93,188 KB |
最終ジャッジ日時 | 2025-06-12 13:18:55 |
合計ジャッジ時間 | 11,971 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | WA * 4 TLE * 1 -- * 29 |
ソースコード
MOD = 10**9 + 7 class AffineNode: __slots__ = ['a', 'c'] def __init__(self, a=1, c=0): self.a = a self.c = c def combine(self, other): new_a = (self.a * other.a) % MOD new_c = (self.a * other.c + self.c) % MOD return AffineNode(new_a, new_c) class SegmentTree: def __init__(self, size): self.n = size self.size = 1 while self.size < self.n: self.size <<= 1 self.tree = [AffineNode() for _ in range(2 * self.size)] def update(self, pos, a, c): pos += self.size self.tree[pos] = AffineNode(a, c) pos >>= 1 while pos >= 1: left = 2 * pos right = 2 * pos + 1 self.tree[pos] = self.tree[left].combine(self.tree[right]) pos >>= 1 def query_range(self, l, r): res = AffineNode() l += self.size r += self.size while l < r: if l % 2 == 1: res = res.combine(self.tree[l]) l += 1 if r % 2 == 1: r -= 1 res = res.combine(self.tree[r]) l >>= 1 r >>= 1 return res def main(): import sys input = sys.stdin.read().split() ptr = 0 n = int(input[ptr]) ptr +=1 q = int(input[ptr]) ptr +=1 x = [0] * n y = [0] * n st = SegmentTree(n) for _ in range(q): query = input[ptr] ptr +=1 if query == 'x' or query == 'y': typ = query i = int(input[ptr]) ptr +=1 v = int(input[ptr]) ptr +=1 if typ == 'x': x[i] = v % MOD else: y[i] = v % MOD a = y[i] c = 1 st.update(i, a, c) else: i = int(input[ptr]) ptr +=1 sum_a = 0 for j in range(i): if j ==0: bj = 1 else: affine = st.query_range(0, j) a = affine.a c_val = affine.c bj = (a * 1 + c_val) % MOD term = (x[j] * (bj * bj) % MOD) % MOD sum_a = (sum_a + term) % MOD a_i = (1 + sum_a) % MOD print(a_i) if __name__ == "__main__": main()