結果

問題 No.3097 Azuki Kurai
コンテスト
ユーザー drken1215
提出日時 2026-09-29 11:29:54
言語 C++23
(gcc 15.3.0 + boost 1.92.0 + ACL)
コンパイル:
g++-15 -O2 -lm -std=c++23 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
AC  
実行時間 1,038 ms / 4,000 ms
+ 397µs
コード長 3,362 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 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
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#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;      
    }
}
0