結果
問題 | No.619 CardShuffle |
ユーザー |
![]() |
提出日時 | 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 |
ソースコード
#!/usr/bin/ python3.8import sysread = sys.stdin.buffer.readreadline = sys.stdin.buffer.readlinereadlines = sys.stdin.buffer.readlinesMOD = 10 ** 9 + 7class SegTree:""" segment tree with point modification and range product access. """data_unit = None@classmethoddef data_f(cls, A, B):if A is None:return Bif B is None:return An = 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 = Nself.data = [self.data_unit] * (N + N)def build(self, raw_data):data = self.dataf = self.data_fN = self.Ndata[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.dataf = self.data_fi += self.Ndata[i] = xwhile i > 1:i >>= 1data[i] = f(data[i << 1], data[i << 1 | 1])def fold(self, L, R):""" compute for [L, R) """vL = vR = self.data_unitdata = self.dataf = self.data_fL += self.NR += self.Nwhile L < R:if L & 1:vL = f(vL, data[L])L += 1if R & 1:R -= 1vR = f(data[R], vR)L >>= 1R >>= 1return 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) // 2seg = 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) - 1y = int(y) - 1if 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)