結果

問題 No.619 CardShuffle
ユーザー maspy
提出日時 2020-04-09 02:53:27
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 952 ms / 3,000 ms
コード長 2,982 bytes
コンパイル時間 173 ms
コンパイル使用メモリ 82,560 KB
実行使用メモリ 122,936 KB
最終ジャッジ日時 2024-07-19 07:24:29
合計ジャッジ時間 14,256 ms
ジャッジサーバーID
(参考情報)
judge4 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 35
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#!/usr/bin/ python3.8
import sys
read = sys.stdin.buffer.read
readline = sys.stdin.buffer.readline
readlines = sys.stdin.buffer.readlines
MOD = 10 ** 9 + 7
class SegTree:
""" segment tree with point modification and range product access. """
data_unit = None
@classmethod
def data_f(cls, A, B):
if A is None:
return B
if B is None:
return A
n = len(A)
m = len(B)
if (n, m) == (1, 1): # A[0] * B[0] *
return (A[0] * B[0] % MOD,)
elif (n, m) == (1, 2): # A[0] * B[0] + B[1] +
return (A[0] * B[0] % MOD, B[1])
elif (n, m) == (1, 3): # A[0] * B[0] + B[1] + B[2] *
return (A[0] * B[0] % MOD, B[1], B[2])
elif (n, m) == (2, 1): # A[0] + A[1] + B[0] *
return (A[0], A[1], B[0])
elif (n, m) == (2, 2): # A[0] + A[1] + B[0] + B[1] +
return (A[0], A[1] + B[0] + B[1])
elif (n, m) == (2, 3): # A[0] + A[1] + B[0] + B[1] + B[2] *
return (A[0], A[1] + B[0] + B[1], B[2])
elif (n, m) == (3, 1): # A[0] + A[1] + A[2] * B[0] *
return (A[0], A[1], A[2] * B[0] % MOD)
elif (n, m) == (3, 2): # A[0] + A[1] + A[2] * B[0] + B[1] +
return (A[0], A[1] + A[2] * B[0] % MOD + B[1])
elif (n, m) == (3, 3): # A[0] + A[1] + A[2] * B[0] + B[1] + B[2] *
return (A[0], A[1] + A[2] * B[0] % MOD + B[1], B[2])
def __init__(self, N):
self.N = N
self.data = [self.data_unit] * (N + N)
def build(self, raw_data):
data = self.data
f = self.data_f
N = self.N
data[N:] = raw_data[:]
for i in range(N - 1, 0, -1):
data[i] = f(data[i << 1], data[i << 1 | 1])
def set_val(self, i, x):
data = self.data
f = self.data_f
i += self.N
data[i] = x
while i > 1:
i >>= 1
data[i] = f(data[i << 1], data[i << 1 | 1])
def fold(self, L, R):
""" compute for [L, R) """
vL = vR = self.data_unit
data = self.data
f = self.data_f
L += self.N
R += self.N
while L < R:
if L & 1:
vL = f(vL, data[L])
L += 1
if R & 1:
R -= 1
vR = f(data[R], vR)
L >>= 1
R >>= 1
return f(vL, vR)
def cards_to_tpl(i):
x, y = C[2 * i: 2 * i + 2]
if y == b'+':
return (int(x), 0)
else:
return (int(x),)
N = int(readline())
N = (N + 1) // 2
seg = SegTree(N)
C = readline().split() + [b'+']
seg.build([cards_to_tpl(i) for i in range(N)])
Q = int(readline())
for _ in range(Q):
t, x, y = readline().split()
x = int(x) - 1
y = int(y) - 1
if t == b'!':
C[x], C[y] = C[y], C[x]
for i in (x // 2, y // 2):
seg.set_val(i, cards_to_tpl(i))
else:
print(sum(seg.fold(x // 2, y // 2 + 1)) % MOD)
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0