Submission #969886

#TimeUsernameProblemLanguageResultExecution timeMemory
969886starchanBootfall (IZhO17_bootfall)C++17
100 / 100
584 ms8140 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define in array<int, 2>
#define pb push_back
#define pob pop_back
#define INF (int)1e17
#define fast() ios_base::sync_with_stdio(false); cin.tie(NULL)
 
const int mod = 1e9+33;
const int MX = 2e5+5e4+10;
 
int dp[MX];
 
void add(int x)
{
	for(int i = MX-1; i >= x; i--)
	{
		dp[i]+=dp[i-x];
		dp[i]%=mod;
	}
	return;
}
 
void rem(int x)
{
	for(int i = x; i < MX; i++)
	{
		dp[i]-=dp[i-x]; dp[i]+=mod;
		dp[i]%=mod;
	}
	return;
}
 
int l[MX];
int r[MX];
int st;

void kill(int x)
{
	if(x == st)
		st = r[st];
	else
	{
		r[l[x]] = r[x];
		l[r[x]] = l[x];
	}
}

signed main()
{
	fast();
	for(int i = 1; i < MX; i++)
	{
		l[i] = i-1;
		r[i] = i+1;
	}
	r[0] = 1;
	dp[0] = 1;
	int n;
	cin >> n;
	int S = 0;
	vector<int> a(n+1);
	for(int i = 1; i <= n; i++)
	{
		cin >> a[i]; S+=a[i];
		add(a[i]);
	}
	if(S%2 || (dp[S/2] == 0))
	{
		cout << "0\n";
		return 0;
	}
	for(int i = 1; i <= n; i++)
	{
		rem(a[i]);
		for(int V = st; V < MX; V = r[V])
		{
			int D = S+V-a[i];
			if(D%2)
				kill(V);
			if(dp[(D/2)] || ((D >= 2*V) && ((dp[(D/2)-V]))))
				continue;
			kill(V);
		}
		add(a[i]);
	}
	vector<int> v;
	for(int V = st; V < MX; V = r[V])
		v.pb(V);
	cout << v.size() << "\n";
	for(int x: v)
		cout << x << " ";
	cout << "\n";
	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...