結果
問題 | No.2549 Paint Eggs |
ユーザー |
|
提出日時 | 2023-11-25 13:58:31 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 388 ms / 2,000 ms |
コード長 | 3,101 bytes |
コンパイル時間 | 207 ms |
コンパイル使用メモリ | 82,404 KB |
実行使用メモリ | 118,812 KB |
最終ジャッジ日時 | 2024-09-26 10:36:24 |
合計ジャッジ時間 | 13,223 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 45 |
ソースコード
class SegTree:@classmethoddef X_op(cls, x, y):return min(x, y)def __init__(self, A):self.X_e = infself.N = len(A)self.log = (self.N - 1).bit_length()self.size = 1 << self.logself.X = [self.X_e] * (self.size << 1)for i, x in enumerate(A):self.X[i + self.size] = xfor i in range(self.size - 1, 0, -1):self.X[i] = self.X_op(self.X[i << 1], self.X[i << 1 | 1])def __iter__(self):for i in range(self.N):yield self.X[i + self.size]def __getitem__(self, i):i %= self.Nreturn self.X[i + self.size]def __setitem__(self, i, x):i %= self.Ni += self.sizeself.X[i] = xwhile i > 1:i >>= 1self.X[i] = self.X_op(self.X[i << 1], self.X[i << 1 | 1])def prod(self, L, R):L += self.sizeR += self.sizevL, vR = self.X_e, self.X_ewhile L < R:if L & 1:vL = self.X_op(vL, self.X[L])L += 1if R & 1:R -= 1vR = self.X_op(self.X[R], vR)L >>= 1R >>= 1return self.X_op(vL, vR)"Binary search for ok = n and ng = N""f(x=seg.prod(L, r))""TODO: f(e) = True"def right_search(self, L, f):L += self.sizesm = self.X_ewhile True:while not L & 1:L >>= 1if not f(self.X_op(sm, self.X[L])):while L < self.size:L <<= 1if f(self.X_op(sm, self.X[L])):sm = self.X_op(sm, self.X[L])L += 1return L - self.sizesm = self.X_op(sm, self.X[L])L += 1if L & -L == L: breakreturn self.Ndef left_search(self, R, f):if R == 0: returnR += self.sizesm = self.X_ewhile True:R -= 1while R > 1 and R & 1:R >>= 1if not f(self.X_op(self.X[R], sm)):while R < self.size:R = (R << 1) + 1if f(self.X_op(self.X[R], sm)):sm = self.X_op(self.X[R], sm)R -= 1return R + 1 - self.sizesm = self.X_op(self.X[R], sm)if R & -R == R: breakreturn 0def __repr__(self):return str(self.X[self.size: self.size + self.N])inf = 10 ** 18N, M, K = map(int, input().split())C = list(map(int, input().split()))A = list(map(int, input().split()))seg = SegTree([K * a for a in A])ans = inffor i in range(N):if i == 0:for j in range(K):c = C[j] - 1seg[c] = seg[c] - A[c]ans = seg.prod(0, M)continueif i + K - 1 >= N:continuec = C[i - 1] - 1seg[c] = seg[c] + A[c]c = C[i + K - 1] - 1seg[c] = seg[c] - A[c]ans = min(ans, seg.prod(0, M))print(ans)