Submission #1142769

#TimeUsernameProblemLanguageResultExecution timeMemory
1142769kitlixBootfall (IZhO17_bootfall)C++20
28 / 100
1095 ms840 KiB
#pragma GCC target("avx2")
#pragma GCC optimize("Ofast,unroll-loops,inline,fast-math")
#include <bits/stdc++.h>

using namespace std;

#ifndef LOCAL
const int MAXN = 500;
const int MAXA = 500;
const int SZ = MAXN * MAXA + 1;
#else
const int MAXN = 20;
const int MAXA = 20;
const int SZ = MAXN * MAXA + 1;
#endif

signed main() {
    ios_base::sync_with_stdio(0), cin.tie(0);
    int n;
    cin >> n;
    vector<int> a(n);
    for (auto& el : a)
        cin >> el;
    sort(a.begin(), a.end(), greater<>());
    auto adddpp = [&](const bitset<SZ>& fw, const bitset<SZ>& bw, int a) {
        bitset<SZ> fwr;
        fwr = (fw << a) | (fw >> a);
        fwr |= (bw >> (MAXN * MAXA - a));
        bitset<SZ> bwr;
        bwr = (bw << a) | (bw >> a);
        bwr |= (fw << (MAXN * MAXA - a));
        return pair{fwr, bwr};
        };
    auto adddp = [&](const bitset<SZ>& bs, int a) {
        bitset<SZ> res;
        res = (bs << a) | (bs >> a);
        int curi = bs._Find_first();
        while (curi < a) {
            res[a - curi] = 1;
            curi = bs._Find_next(curi);
        }
        return res;
        };
    bitset<SZ> cur;
    cur[0] = 1;
    for (int i = 0; i < n; ++i)
        cur = adddp(cur, a[i]);
    if (!cur[0]) {
        cout << 0;
        return 0;
    }
    bitset<SZ> ans;
    ans.set();
    for (int i = 0; i < n; ++i) {
        bitset<SZ> fw, bw;
        fw[0] = 1, bw[MAXN * MAXA] = 1;
        for (int j = 0; j < n; ++j) {
            if (j != i) {
                auto res = adddpp(fw, bw, a[j]);
                fw = res.first;
                bw = res.second;
            }
        }
        ans &= fw;
    }
    vector<int> vars;
    for (int i = 1; i <= MAXN * MAXA; ++i)
        if (ans[i])
            vars.push_back(i);
    cout << vars.size() << '\n';
    for (auto el : vars)
        cout << el << ' ';
    // vector<bitset<SZ>> prefdp(n / 2), suffdp(n / 2);
    // bitset<SZ> cur;
    // cur[0] = 1;
    // for (int i = 0; i < n / 2; ++i) {
    //     cur = adddp(cur, a[i]);
    //     prefdp[i] = cur;
    // }
    // cur.reset();
    // cur[0] = 1;
    // for (int i = 0; i < n / 2; ++i) {
    //     cur = adddp(cur, a[n - 1 - i]);
    //     suffdp[i] = cur;
    // }
    // cur.reset();
    // cur[0] = 1;
    // for (int i = 0; i < n; ++i)
    //     cur = adddp(cur, a[i]);
    // if (!cur[0]) {
    //     cout << 0;
    //     return 0;
    // }
    // bitset<SZ> ans;
    // ans.set();
    // for (int i = 0; i < n; ++i) {
    //     bitset<SZ> bs;
    //     bs[0] = 1;
    //     if (i < n / 2) {
    //         if (i)
    //             bs = prefdp[i - 1];
    //         for (int j = i + 1; j < n; ++j)
    //             bs = adddp(bs, a[j]);
    //     } else {
    //         if (i != n - 1)
    //             bs = suffdp[n - 1 - (i + 1)];
    //         for (int j = i - 1; j >= 0; --j)
    //             bs = adddp(bs, a[j]);
    //     }
    //     ans &= bs;
    // }
    // vector<int> vars;
    // for (int i = 1; i <= MAXN * MAXA; ++i)
    //     if (ans[i])
    //         vars.push_back(i);
    // cout << vars.size() << '\n';
    // for (auto el : vars)
    //     cout << el << ' ';
}


#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...