結果
| 問題 | No.3097 Azuki Kurai |
| コンテスト | |
| ユーザー |
drken1215
|
| 提出日時 | 2026-09-29 11:29:54 |
| 言語 | C++23 (gcc 15.3.0 + boost 1.92.0 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 1,038 ms / 4,000 ms |
| + 397µs | |
| コード長 | 3,362 bytes |
| 記録 | |
| コンパイル時間 | 2,437 ms |
| コンパイル使用メモリ | 339,708 KB |
| 実行使用メモリ | 9,904 KB |
| 最終ジャッジ日時 | 2026-09-29 11:30:38 |
| 合計ジャッジ時間 | 36,618 ms |
|
ジャッジサーバーID (参考情報) |
judge2_0 / judge1_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 32 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
// output stream
#define COUT(x) cout << #x << " = " << (x) << " (L" << __LINE__ << ")" << endl
template<class S, class T> ostream& operator << (ostream &s, const pair<S, T> &P)
{ return s << '<' << P.first << ", " << P.second << '>'; }
template<class T> ostream& operator << (ostream &s, const array<T, 2> &P)
{ return s << '<' << P[0] << "," << P[1] << '>'; }
template<class T> ostream& operator << (ostream &s, const array<T, 3> &P)
{ return s << '<' << P[0] << "," << P[1] << "," << P[2] << '>'; }
template<class T> ostream& operator << (ostream &s, const array<T, 4> &P)
{ return s << '<' << P[0] << "," << P[1] << "," << P[2] << "," << P[3] << '>'; }
template<class T> ostream& operator << (ostream &s, const vector<string> &P)
{ for (int i = 0; i < P.size(); ++i) { s << P[i] << endl; } return s; }
template<class T> ostream& operator << (ostream &s, const vector<T> &P)
{ for (int i = 0; i < P.size(); ++i) { if (i > 0) { s << " "; } s << P[i]; } return s; }
template<class T> ostream& operator << (ostream &s, const deque<T> &P)
{ for (int i = 0; i < P.size(); ++i) { if (i > 0) { s << " "; } s << P[i]; } return s; }
template<class T> ostream& operator << (ostream &s, const vector<vector<T>> &P)
{ for (int i = 0; i < P.size(); ++i) { s << endl << P[i]; } return s << endl; }
template<class T> ostream& operator << (ostream &s, const set<T> &P)
{ for (auto it : P) { s << "<" << it << "> "; } return s; }
template<class T> ostream& operator << (ostream &s, const multiset<T> &P)
{ for (auto it : P) { s << "<" << it << "> "; } return s; }
template<class T> ostream& operator << (ostream &s, const unordered_set<T> &P)
{ for (auto it : P) { s << "<" << it << "> "; } return s; }
template<class S, class T> ostream& operator << (ostream &s, const map<S, T> &P)
{ for (auto it : P) { s << "<" << it.first << "->" << it.second << "> "; } return s; }
template<class S, class T> ostream& operator << (ostream &s, const unordered_map<S, T> &P)
{ for (auto it : P) { s << "<" << it.first << "->" << it.second << "> "; } return s; }
//------------------------------//
// Examples
//------------------------------//
int main() {
int N, M, K;
long long INF = 1LL << 40;
cin >> N >> M >> K;
vector<long long> A(N), B(M);
for (int i = 0; i < N; i++) cin >> A[i];
for (int i = 0; i < M; i++) cin >> B[i], B[i]--;
vector<long long> dp(1 << N, 0);
for (int S = 0; S < (1 << N); S++) {
for (int i = 0; i < N; i++) if (!(S >> i & 1)) dp[S] += A[i];
}
for (int iter = 0; iter < M; iter++) {
vector<long long> nex(1 << N, INF);
for (int S = 0; S < (1 << N); S++) {
int canchange = ((1 << N) - 1) ^ S;
for (int change = canchange; ;change = (change - 1) & canchange) {
int S2 = S ^ change;
long long add = 0;
for (int i = 0; i < N; i++) {
if (!(S >> i & 1)) continue;
if (!(S2 >> ((i+1)%N) & 1) || !(S2 >> ((i-1+N)%N) & 1)) add += K;
}
nex[S2] = min(nex[S2], dp[S] + add);
if (!change) break;
}
}
swap(dp, nex);
for (int S = 0; S < (1 << N); S++) if (!(S >> B[iter] & 1)) dp[S] = min(dp[S], dp[S + (1 << B[iter])]);
cout << dp[0] << endl;
}
}
drken1215