제출 #1351351

#제출 시각아이디문제언어결과실행 시간메모리
1351351WarinchaiBootfall (IZhO17_bootfall)C++20
28 / 100
1095 ms796 KiB
#include<bits/stdc++.h>
using namespace std;

int a[505];
bitset<500005> dp[2];
bitset<500005> dp2;
int st;
int X=1000;

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n;cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    X*=n;
    st=X/2;
    for(int i=0;i<=X;i++)dp[0][i]=dp[1][i]=0;
    dp[0][st]=1;
    for(int i=0;i<=X;i++)dp2[i]=1;
    int can=0;
    for(int i=1;i<=n+1;i++){
        int cur=0;
        for(int i=0;i<=X;i++)dp[0][i]=dp[1][i]=0;
        dp[0][st]=1;
        //cerr<<"i:"<<i<<"\n";
        for(int j=1;j<=n;j++){
            if(j==i)continue;
            cur^=1;
            dp[cur]=0;
            dp[cur]=(dp[cur^1]<<a[j])|(dp[cur^1]>>a[j]);
        }
        //cerr<<"i:"<<i<<"\n";
        //for(int j=0;j<=X*n;j++)cerr<<dp[cur][j]<<" ";
        //cerr<<"\n";
        if(i==n+1){
            if(dp[cur][st])can=1;
            break;
        }
        dp2=dp2&dp[cur];
    }
    if(can==0){
        cout<<0<<"\n";
        return 0;
    }
    vector<int>ans;
    for(int i=st;i<=X;i++)if(dp2[i]){
        ans.push_back(i-st);
    }
    cout<<ans.size()<<"\n";
    for(auto x:ans)cout<<x<<" ";
}
#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...