제출 #340103

#제출 시각아이디문제언어결과실행 시간메모리
340103SprdaloBootfall (IZhO17_bootfall)C++17
100 / 100
413 ms4580 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pi;
typedef pair<ll, ll> pl;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<double> vd;
typedef vector<bool> vb;
typedef vector<char> vc;
typedef vector<string> vs;
typedef vector<pi> vp;
typedef vector<pl> vpl;

void no(){
    cout << "0\n";
    exit(0);
}

const int M = 500*500;
int d[M+505], dp[M+505], a[M+505], cnt[M+505], vis[M+505];
vi sol;

int main()
{
    int n;
    cin >> n;

    int suma = 0;
    for (int i = 0; i < n; ++i){
        cin >> a[i];
        suma += a[i];
    }

    if (suma%2) no();

    dp[0]=1;
    for (int i = 0; i < n; ++i){
        for (int j = M; j > -1; --j){
            dp[a[i]+j] += dp[j];
        }
    }

    if (!dp[suma/2]) no();

    int b = 0;
    for (int i = 0; i < n; ++i){
        if (vis[a[i]]){
            ++b;
            continue;
        }
        memset(d, 0, sizeof(d));

        for (int j = 0; j <= M; ++j){
            d[j] += dp[j];
            d[j+a[i]] -= d[j];
        }

        for (int j = 0; j <= M; ++j){
            if ((suma-a[i]+j)%2 == 0 && suma-a[i]-j>=0 && d[(suma-a[i]-j)/2]){
                ++cnt[j];
            }
        }
    }

    for (int i = 1; i <= M; ++i)
        if (cnt[i] == n-b)
            sol.push_back(i);

    cout << (int)sol.size() << '\n';

    for (auto& i : sol)
        cout << i << ' ';
}
#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...