結果
| 問題 | No.1780 [Cherry Anniversary] 真冬に咲く26の櫻の木 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-04-13 23:39:21 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
AC
|
| 実行時間 | 493 ms / 2,000 ms |
| コード長 | 2,424 bytes |
| 記録 | |
| コンパイル時間 | 200 ms |
| コンパイル使用メモリ | 85,120 KB |
| 実行使用メモリ | 127,204 KB |
| 最終ジャッジ日時 | 2026-04-13 23:39:34 |
| 合計ジャッジ時間 | 11,744 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge2_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 42 |
ソースコード
## https://yukicoder.me/problems/no/1780
ALPHA_NUM = 26
NODE_NUM = 16
MIN_INT = -float("inf")
def main():
C = list(map(int, input().split()))
K = list(map(int, input().split()))
N = int(input())
S = []
for _ in range(N):
s, a, b, e = input().split()
S.append((s, int(a), int(b), int(e)))
# matrix構築
matrix_list = [[[MIN_INT for _ in range(NODE_NUM)] for _ in range(NODE_NUM)] for _ in range(ALPHA_NUM)]
for i in range(ALPHA_NUM):
for j in range(NODE_NUM):
matrix_list[i][j][j] = 0
for i in range(N):
s, a, b, e = S[i]
s = set([s0 for s0 in s])
a -= 1
b -= 1
for s0 in s:
s1 = ord(s0) - ord("A")
matrix_list[s1][a][b] = max(matrix_list[s1][a][b], e)
matrix_list[s1][b][a] = max(matrix_list[s1][b][a], e)
def prod_vector(matrix, vector):
new_vector = [MIN_INT for _ in range(NODE_NUM)]
for i in range(NODE_NUM):
for j in range(NODE_NUM):
new_vector[i] = max(new_vector[i], matrix[i][j] + vector[j])
return new_vector
def prod_matrix(left, right):
new_matrix = [[MIN_INT for _ in range(NODE_NUM)] for _ in range(NODE_NUM)]
for i in range(NODE_NUM):
for j in range(NODE_NUM):
for k in range(NODE_NUM):
new_matrix[i][j] = max(new_matrix[i][j], left[i][k] + right[k][j])
return new_matrix
dp_list = []
for alpha in range(ALPHA_NUM):
k = K[alpha]
vector = [MIN_INT for _ in range(NODE_NUM)]
vector[C[alpha] - 1] = 0
base_matrix = matrix_list[alpha]
while k > 0:
if k % 2 == 1:
vector = prod_vector(base_matrix, vector)
base_matrix = prod_matrix(base_matrix, base_matrix)
k //= 2
dp_list.append(vector)
# 答え
answer = MIN_INT
for target_color in range(NODE_NUM):
is_ok = True
value = 0
for alpha in range(ALPHA_NUM):
if dp_list[alpha][target_color] == MIN_INT:
is_ok = False
break
else:
value += dp_list[alpha][target_color]
if is_ok:
answer = max(answer, value)
if answer == MIN_INT:
print("Impossible")
else:
print(answer)
if __name__ == '__main__':
main()