結果
| 問題 | No.2423 Merge Stones |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-03-09 01:38:12 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
AC
|
| 実行時間 | 1,103 ms / 4,000 ms |
| コード長 | 1,463 bytes |
| 記録 | |
| コンパイル時間 | 3,973 ms |
| コンパイル使用メモリ | 84,968 KB |
| 実行使用メモリ | 82,184 KB |
| 最終ジャッジ日時 | 2026-03-09 01:54:27 |
| 合計ジャッジ時間 | 49,496 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 72 |
ソースコード
# https://yukicoder.me/problems/no/2423
def main():
N, K = map(int, input().split())
A = list(map(int, input().split()))
C = list(map(int, input().split()))
dp = [[-1] * (N) for _ in range(N)]
answer = 0
for i in range(N):
c_bit = (1 << (C[i] - 1))
dp[i][i] = c_bit
answer = max(answer, A[i])
for length in range(2, N + 1):
ans = 0
for i in range(length - 1):
ans += A[i]
for l in range(N):
r = l + length - 1
r_mod = (l + length - 1) % N
ans += A[r_mod]
ans_bit = 0
for mid in range(l, r):
mid_mod = mid % N
mid_mod1 = (mid + 1) % N
bit_l = dp[l][mid_mod]
bit_r = dp[mid_mod1][r_mod]
for k in range(K + 1):
if (bit_l << k) & bit_r > 0:
x = (bit_l << k) & bit_r
ans_bit |= x
ans_bit |= (x >> k)
for k in range(1, K + 1):
if (bit_l >> k) & bit_r > 0:
x = (bit_l >> k) & bit_r
ans_bit |= x
ans_bit |= (x << k)
dp[l][r_mod] = ans_bit
if ans_bit > 0:
answer = max(answer, ans)
ans -= A[l]
print(answer)
if __name__ == "__main__":
main()