Submission #472833

#TimeUsernameProblemLanguageResultExecution timeMemory
472833ogibogi2004Bootfall (IZhO17_bootfall)C++14
100 / 100
610 ms84028 KiB
#include<bits/stdc++.h>
using namespace std;
const int MAXN=512;
int n,a[MAXN],sum;
struct node
{
    vector<int>vals;
    bitset<MAXN*MAXN>possible;
};
node tree[4*MAXN];
bitset<MAXN*MAXN>without[MAXN];
void update(int l,int r,int idx,int ql,int qr,int val)
{
    if(l>qr)return;
    if(r<ql)return;
    if(l>=ql&&r<=qr)
    {
        tree[idx].vals.push_back(val);
        return;
    }
    int mid=(l+r)/2;
    update(l,mid,idx*2,ql,qr,val);
    update(mid+1,r,idx*2+1,ql,qr,val);
}
void build(int l,int r,int idx)
{
    tree[idx].possible[0]=1;
    for(auto xd:tree[idx].vals)
    {
        tree[idx].possible=tree[idx].possible|(tree[idx].possible<<xd);
    }
    if(l==r)
    {
        without[l]=tree[idx].possible;
        return;
    }
    int mid=(l+r)/2;
    tree[idx*2].possible=tree[idx].possible;
    tree[idx*2+1].possible=tree[idx].possible;
    build(l,mid,idx*2);
    build(mid+1,r,idx*2+1);
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++){cin>>a[i];sum+=a[i];}
    if(sum%2==1)
    {
        cout<<"0\n";
        return 0;
    }
    for(int i=1;i<=n;i++)
    {
        update(1,n+1,1,1,i-1,a[i]);
        update(1,n+1,1,i+1,n+1,a[i]);
    }
    build(1,n+1,1);
    if(without[n+1][sum/2]==0)
    {
        cout<<"0\n";
        return 0;
    }
    //cout<<"?\n";
    vector<int>ans;
    for(int cand=1;cand<=sum;cand++)
    {
        bool ok=1;
        for(int i=1;i<=n;i++)
        {
            int sum1=sum+cand-a[i];
            if(sum1%2!=0)
            {
                ok=0;break;
            }
            if(without[i][sum1/2]==0)
            {
                ok=0;break;
            }
        }
        if(ok)ans.push_back(cand);
    }
    cout<<ans.size()<<endl;
    for(auto xd:ans)
    {
        cout<<xd<<" ";
    }
    cout<<endl;
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...