結果
| 問題 |
No.1780 [Cherry Anniversary] 真冬に咲く26の櫻の木
|
| コンテスト | |
| ユーザー |
SSRS
|
| 提出日時 | 2021-12-09 00:15:35 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,161 bytes |
| コンパイル時間 | 2,259 ms |
| コンパイル使用メモリ | 187,160 KB |
| 実行使用メモリ | 17,316 KB |
| 最終ジャッジ日時 | 2024-07-16 11:18:57 |
| 合計ジャッジ時間 | 5,543 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 41 WA * 1 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
const int LOG = 24;
const long long INF = 100000000000000000;
int main(){
vector<int> C(26);
for (int i = 0; i < 26; i++){
cin >> C[i];
C[i]--;
}
vector<int> K(26);
for (int i = 0; i < 26; i++){
cin >> K[i];
}
int N;
cin >> N;
vector<string> S(N);
vector<int> A(N), B(N), E(N);
for (int i = 0; i < N; i++){
cin >> S[i] >> A[i] >> B[i] >> E[i];
A[i]--;
B[i]--;
}
vector<int> s(N, 0);
for (int i = 0; i < N; i++){
int L = S[i].size();
for (int j = 0; j < L; j++){
s[i] |= 1 << (S[i][j] - 'A');
}
}
vector<long long> sum(16, 0);
for (int i = 0; i < 26; i++){
vector<vector<long long>> P(16, vector<long long>(16, -INF));
for (int j = 0; j < N; j++){
if ((s[j] >> i & 1) == 1){
P[A[j]][B[j]] = max(P[A[j]][B[j]], (long long) E[j]);
P[B[j]][A[j]] = max(P[B[j]][A[j]], (long long) E[j]);
}
}
for (int j = 0; j < 16; j++){
P[j][j] = 0;
}
vector<vector<vector<long long>>> dp(LOG, vector<vector<long long>>(16, vector<long long>(16, -INF)));
dp[0] = P;
for (int j = 0; j < LOG - 1; j++){
for (int k = 0; k < 16; k++){
for (int m = 0; m < 16; m++){
for (int n = 0; n < 16; n++){
dp[j + 1][k][n] = max(dp[j + 1][k][n], dp[j][k][m] + dp[j][m][n]);
}
}
}
}
vector<vector<long long>> c(16, vector<long long>(16, -INF));
for (int j = 0; j < 16; j++){
c[j][j] = 0;
}
for (int j = 0; j < LOG; j++){
if ((K[i] >> j & 1) == 1){
vector<vector<long long>> c2(16, vector<long long>(16, -INF));
for (int k = 0; k < 16; k++){
for (int m = 0; m < 16; m++){
for (int n = 0; n < 16; n++){
c2[k][n] = max(c2[k][n], c[k][m] + dp[j][m][n]);
}
}
}
swap(c, c2);
}
}
for (int j = 0; j < 16; j++){
sum[j] += c[C[i]][j];
}
}
long long mx = -INF;
for (int i = 0; i < 16; i++){
mx = max(mx, sum[i]);
}
if (mx < 0){
cout << "Impossible" << endl;
} else {
cout << mx << endl;
}
}
SSRS