結果
問題 |
No.2332 Make a Sequence
|
ユーザー |
![]() |
提出日時 | 2025-06-12 19:21:29 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,858 bytes |
コンパイル時間 | 189 ms |
コンパイル使用メモリ | 82,720 KB |
実行使用メモリ | 175,144 KB |
最終ジャッジ日時 | 2025-06-12 19:22:00 |
合計ジャッジ時間 | 6,859 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 3 WA * 2 TLE * 1 -- * 55 |
ソースコード
def main(): import sys input = sys.stdin.read data = input().split() idx = 0 N = int(data[idx]) M = int(data[idx + 1]) idx += 2 A = list(map(int, data[idx:idx + N])) idx += N B = list(map(int, data[idx:idx + M])) idx += M C = list(map(int, data[idx:idx + M])) # Precompute max_k for each position in B S = A + ['#'] + B len_S = len(S) prefix = [0] * len_S for i in range(1, len_S): j = prefix[i - 1] while j > 0 and S[i] != S[j]: j = prefix[j - 1] if S[i] == S[j]: j += 1 prefix[i] = j max_k = [0] * (M + 1) for i in range(M): pos = len(A) + 1 + i max_k[i + 1] = prefix[pos] # Check if B can be formed for i in range(1, M + 1): if max_k[i] == 0: print(-1) return # Initialize dp dp = [-1] * (M + 1) dp[0] = 0 from collections import deque class Line: def __init__(self, a, b): self.a = a self.b = b def get(self, x): return self.a * x + self.b dq = deque() for i in range(1, M + 1): current_max_k = max_k[i] if current_max_k == 0: print(-1) return j_min = i - current_max_k j_max = i - 1 if j_min < 0: j_min = 0 best = None for j in range(j_min, j_max + 1): if dp[j] == -1: continue line = Line(C[j], dp[j] - j * C[j]) current = line.get(i) if best is None or current < best: best = current if best is not None: dp[i] = best else: dp[i] = -1 print(dp[M] if dp[M] != -1 else -1) if __name__ == '__main__': main()