Submission #37474

#TimeUsernameProblemLanguageResultExecution timeMemory
37474HardNutBootfall (IZhO17_bootfall)C++14
100 / 100
973 ms4824 KiB
#include<bits/stdc++.h>

using namespace std;

const int N = 250005;
const int mod = 1e9 + 7;

typedef long long ll;

int n, a[505], sum;
vector<int> vec;
int ans[N];
int dp[N];
bool used[505];

void add(int v) {
    for (int i = sum; i >= 0; i--) {
        dp[i + v] += dp[i];
        if (dp[i + v] >= mod)
            dp[i + v] -= mod;
    }
    sum += v;
}

void del(int v) {
    sum -= v;
    for (int i = 0; i <= sum; i++) {
        dp[i + v] = (dp[i + v] - dp[i] + mod);
        if (dp[i + v] >= mod)
            dp[i + v] -= mod;
    }
}

int main() {
//    freopen("bootfall.in", "r", stdin);
//    freopen("bootfall.out", "w", stdout);
    scanf("%d", &n);
    dp[0] = 1;
    for (int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
        add(a[i]);
    }
    if (sum % 2 == 1) {
        cout << 0;
        return 0;
    }
    for (int i = 1; i <= sum; i++) {
        ans[i] = 1;
    }
    if (!dp[sum / 2]) {
        cout << 0;
        return 0;
    }
    for (int i = 1; i <= n; i++) {
        if (used[a[i]])
            continue;
        used[a[i]] = 1;
        del(a[i]);
        for (int j = 1; j <= N; j++) {
            if ((sum + j) % 2) {
                ans[j] = 0;
                continue;
            }
            if (!dp[(sum + j) / 2]) {
                ans[j] = 0;
            }
        }
        add(a[i]);
    }
    int cnt = 0;
    for (int i = 1; i <= sum; i++) {
        if (ans[i])
            vec.push_back(i);
    }
    printf("%d\n", vec.size());
    for (int i = 0; i < vec.size(); i++)
        printf("%d ", vec[i]);
}

Compilation message (stderr)

bootfall.cpp: In function 'int main()':
bootfall.cpp:75:30: warning: format '%d' expects argument of type 'int', but argument 2 has type 'std::vector<int>::size_type {aka long unsigned int}' [-Wformat=]
     printf("%d\n", vec.size());
                              ^
bootfall.cpp:76:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < vec.size(); i++)
                       ^
bootfall.cpp:70:9: warning: unused variable 'cnt' [-Wunused-variable]
     int cnt = 0;
         ^
bootfall.cpp:37:20: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &n);
                    ^
bootfall.cpp:40:27: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d", &a[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...