Submission #333669

#TimeUsernameProblemLanguageResultExecution timeMemory
333669amunduzbaevBootfall (IZhO17_bootfall)C++14
100 / 100
278 ms3612 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define all(x) x.begin(), x.end()
#define pb push_back
const int N = 250000;
int dp[N], used[N];

int main(){
	
	int n;
	cin>>n;
	vector<ll>a(n);
	ll sum = 0;
	for(int i=0;i<n;i++){
		cin>>a[i];
		sum += a[i];
	}
	sort(all(a));
	
	dp[0] = 1;
	for(int i=0;i<n;i++){
		for(int j=sum; j>= a[i]; j--){
			dp[j] += dp[j - a[i]];
		}
	}
	if(sum & 1 || !dp[sum/2]){
		cout<<0;
		return 0;
	}
	int cur = sum;
	for(int i=0;i<n;i++){
		for(int j=a[i]; j<= sum; j++){
			dp[j] -= dp[j - a[i]];
		}
		cur -= a[i];
		for(int j = cur/2; j <= sum - a[i]; j++){
			if(dp[j] && j*2 > (sum - a[i])){
				used[j*2 - (sum - a[i])] ++;
			}
		}
		cur += a[i];
		for(int j = sum; j >= a[i]; j--){
			dp[j] += dp[j - a[i]];
		}
	}
	
	vector<int>ans;
	for(int i=1; i<=sum; i++){
		if(used[i] == n) ans.pb(i);
	}
	cout<<ans.size()<<'\n';
	for(auto x:ans) cout<<x<<" ";
	
	return 0;
}
/*
4
1 3 1 5
6
3 5 7 11 9 13
3
2 2 2
4
200 200 200 200
*/
#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...