結果
| 問題 |
No.3097 Azuki Kurai
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-03-29 04:34:29 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 943 ms / 4,000 ms |
| コード長 | 2,428 bytes |
| コンパイル時間 | 344 ms |
| コンパイル使用メモリ | 82,116 KB |
| 実行使用メモリ | 86,720 KB |
| 最終ジャッジ日時 | 2025-04-05 12:45:37 |
| 合計ジャッジ時間 | 28,771 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 32 |
ソースコード
import sys
import random
N_MAX = 10
M_MAX = 2000
bit_N_MAX = 1 << N_MAX
sup = 1 << 60
# bit[i] = 1 << i
bit = [1 << i for i in range(25)]
def chmin(a, b):
return min(a, b)
def solve1_ac(N, M, K, A, B, ans):
q = {}
n = {}
for i in range(N):
for k in range(1 << N):
n[(i, k)] = 0
q[(i, k)] = []
kk = (k ^ bit[i]) if (k & bit[i]) else k
l = kk
while l < (1 << N):
if (l & bit[i]) != 0:
l = (l + 1) | kk
continue
for j in range(N):
if (
(k & bit[(j - 1 + N) % N]) == 0
and (k & bit[j]) == 0
and (k & bit[(j + 1) % N]) == 0
and (l & bit[j]) != 0
):
break
if j == N - 1:
count = sum(
1
for j in range(N)
if (k & bit[j]) != 0
and (
(i != (j - 1 + N) % N and (l & bit[(j - 1 + N) % N]) == 0)
or (i != (j + 1) % N and (l & bit[(j + 1) % N]) == 0)
)
)
q[(i, k)].append((l, count))
n[(i, k)] += 1
l = (l + 1) | kk
dp = [[sup] * (1 << N) for _ in range(2)]
prev, cur = 0, 1
for k in range(1 << N):
dp[0][k] = sum(A[j] for j in range(N) if (k & bit[j]) == 0)
for i in range(1, M + 1):
dp[cur] = [sup] * (1 << N)
for k in range(1 << N):
for l, cnt in q.get((B[i], k), []):
dp[cur][l] = chmin(dp[cur][l], dp[prev][k] + K * cnt)
ans[i] = dp[cur][0]
prev, cur = cur, prev
def create_random_instance(N, M, A, B):
for i in range(N):
A[i] = random.randint(0, 10)
for i in range(1, M + 1):
B[i] = random.randint(0, N - 1)
return random.randint(1, 3)
def main():
N, M, K = map(int, sys.stdin.readline().split())
A = list(map(int, sys.stdin.readline().split()))
B = [0] + list(map(lambda x: int(x) - 1, sys.stdin.readline().split())) # 1-based index
ans = [0] * (M + 1)
solve1_ac(N, M, K, A, B, ans)
for i in range(1, M + 1):
print(ans[i])
if __name__ == "__main__":
main()