結果
| 問題 |
No.510 二次漸化式
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 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()
gew1fw