제출 #566539

#제출 시각아이디문제언어결과실행 시간메모리
566539milisavBootfall (IZhO17_bootfall)C++14
65 / 100
1082 ms3128 KiB
    #include"bits/stdc++.h"
    using namespace std;
    #include <ext/pb_ds/assoc_container.hpp>
    #include <ext/pb_ds/tree_policy.hpp>
    using namespace __gnu_pbds;
    template<class x>
    using ordered_set = tree<x, null_type,less<x>, rb_tree_tag,tree_order_statistics_node_update>;
    mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
    //bool plc[600000];
    const int mod=1e9+7;
    int occ[2500000];
    int good[2500006],a[5005],maxn;
    int main()
    {
        ios_base::sync_with_stdio(0);
        cin.tie(0);
        int n,sum=0;
        cin>>n;
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
            sum+=a[i];
        }
        maxn=sum;
        sort(a,a+n);
        //reverse(a,a+n);
        //plc[0]=true;
        vector <int> h;
        occ[0]=1;
        //yes.push_back(0);
        for(int i=0;i<n;i++)
        {
            for(int j=maxn;j>=a[i];j--)
            {
                occ[j]+=occ[j-a[i]];
                while(occ[j]>mod)
                    occ[j]-=mod;
            }
        }
        
        //cout<<"HI"<<endl;
        if(occ[sum/2]!=0&&sum%2==0)
        {
            for(int k=0;k<n;k++)
            {
                sum-=a[k];
                for(int i=a[k];i<=maxn;i++)
                {
                    if(occ[i-a[k]]!=0){
                    occ[i]-=occ[i-a[k]];
                    if(occ[i]<0)
                        occ[i]+=mod;
                    
                    }
                }
                /*for(int i=0;i<=15;i++)
                {
                    cout<<occ[i]<<" ";
                }
                cout<<"\n";*/
                //cout<<"HELLO"<<endl;
                for(int i=0;i<=sum;i++)
                {
                    int oth=i-(sum-i);
                    if(oth<=0||oth>=maxn)
                        continue;
                    if(occ[i]!=0){
                        good[oth]++;
                        //cout<<oth<<" ";
                        //cout<<oth<<" ";
                    }
                }
                for(int i=maxn;i>=a[k];i--)
                {
                    if(occ[i-a[k]]!=0){
                    occ[i]+=occ[i-a[k]];
                    while(occ[i]>mod)
                        occ[i]-=mod;
                    }
                }
                //cout<<endl;
                sum+=a[k];
            }
            
        }
        for(int i=1;i<=maxn;i++)
            {
     
                    if(good[i]==n){
                        //cout<<"???"<<endl;
                        h.push_back(i);
            }
        }
        cout<<h.size()<<"\n";
        for(auto i : h)
            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...