Submission #1144297

#TimeUsernameProblemLanguageResultExecution timeMemory
1144297woohyun_jngCookies (JOI23_cookies)C++20
100 / 100
400 ms376704 KiB
#include <bits/stdc++.h>
#define MAX 16000

using namespace std;
typedef array<int, 2> pr;

int A[MAX], B[MAX], val[MAX];
bool chk[MAX];
bitset<MAX> mask[MAX];

signed main() {
    // ios_base::sync_with_stdio(false);
    // cin.tie(0), cout.tie(0);

    int N, M, S = 0, ans = -1, X;
    pr K;
    priority_queue<pr> pq;
    vector<int> arr;

    cin >> N;
    for (int i = 1; i <= N; i++) {
        cin >> A[i], S += A[i];
        pq.push({A[i], i});
    }

    for (int i = 1; i <= S; i++)
        for (int j = 1; j <= N; j++)
            val[i] += min(i, A[j]);

    cin >> M;
    for (int i = 1; i <= M; i++)
        cin >> B[i], chk[B[i]] = 1;

    vector<vector<bitset<MAX>>> dp(S + 1);
    dp[0] = vector<bitset<MAX>>(S + 1);
    for (int i = 0; i <= S; i++)
        dp[0][i][0] = 1;

    for (int i = 1; i <= S; i++)
        dp[i] = vector<bitset<MAX>>(S / i + 1);

    mask[0][0] = 1;
    for (int i = 1; i <= S; i++)
        mask[i] = mask[i - 1], mask[i][i] = 1;

    for (int i = 1; i <= S; i++) {
        for (int j = S / i; j >= 1; j--) {
            if (j < S / i)
                dp[i][j] = dp[i][j + 1];
            if (chk[j] && (i == 1 || j <= S / (i - 1)))
                dp[i][j] |= dp[i - 1][j] << j;
            dp[i][j] &= mask[val[i]];
        }
    }

    for (int i = 1; i <= S; i++)
        if (dp[i][1][S]) {
            ans = i;
            break;
        }

    cout << ans << '\n';
    if (ans == -1)
        return 0;

    for (int i = ans; i >= 1; i--) {
        for (int j = S / i; j >= 1; j--) {
            if (!dp[i][j][S])
                continue;
            X = j, S -= j;
            while (X--) {
                K = pq.top(), pq.pop();
                A[K[1]]--, arr.push_back(K[1]);
            }

            cout << arr.size() << ' ';
            for (int i : arr)
                cout << i << ' ', pq.push({A[i], i});
            cout << '\n';
            arr.clear();
            break;
        }
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...