# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1167149 | SmuggingSpun | Bootfall (IZhO17_bootfall) | C++20 | 123 ms | 12720 KiB |
#include<bits/stdc++.h>
#define taskname "A"
using namespace std;
const int lim = 505;
int n, a_max, a_sum = 0, a[lim];
namespace sub12{
const int LIM = 2500;
void solve(){
bitset<LIM>dp;
dp.reset();
dp.set(0);
for(int i = 1; i <= n; i++){
dp |= dp << a[i];
}
if((a_sum & 1) || !dp.test(a_sum >> 1)){
return void(cout << 0);
}
vector<int>ans;
for(int i = a_sum - a_max; i > 0; i--){
ans.emplace_back(i);
for(int j = 1; j <= n; j++){
int sum = a_sum + i - a[j];
if(sum & 1){
ans.pop_back();
break;
}
dp.reset();
dp.reset(0);
dp.set(i);
sum >>= 1;
for(int k = 1; k <= n; k++){
if(k != j){
dp |= dp << a[k];
if(dp.test(sum)){
break;
}
}
}
if(!dp.test(sum)){
ans.pop_back();
break;
}
}
}
cout << ans.size() << "\n";
for(int i = ans.size(); i > 0; ){
cout << ans[--i] << " ";
}
}
}
namespace sub3456{
const int LIM = 25e4 + 1;
const int mod = 1e9 + 9;
void add(int& a, int b){
if((a += b) >= mod){
a -= mod;
}
}
void sub(int& a, int b){
if((a -= b) < 0){
a += mod;
}
}
int dp[LIM];
bitset<LIM>imp[lim];
void add_item(int x){
for(int i = a_sum; i >= x; i--){
add(dp[i], dp[i - x]);
}
}
void remove_item(int x){
for(int i = x; i <= a_sum; i++){
sub(dp[i], dp[i - x]);
}
}
void solve(){
memset(dp, 0, sizeof(dp));
for(int i = dp[0] = 1; i <= n; i++){
add_item(a[i]);
}
if((a_sum & 1) || dp[a_sum >> 1] == 0){
return void(cout << 0);
}
for(int i = 1; i <= n; add_item(a[i++])){
remove_item(a[i]);
imp[i].reset();
for(int j = 0; j <= a_sum; j++){
if(dp[j] == 0){
imp[i].set(j);
}
}
}
vector<int>ans;
for(int i = a_sum - a_max; i > 0; i--){
ans.emplace_back(i);
for(int j = 1; j <= n; j++){
int sum = a_sum + i - a[j];
if((sum & 1) || (imp[j].test(sum >>= 1) && (sum < i || imp[j].test(sum - i)))){
ans.pop_back();
break;
}
}
}
cout << ans.size() << "\n";
for(int i = ans.size(); i > 0; ){
cout << ans[--i] << " ";
}
}
}
int main(){
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
if(fopen(taskname".inp", "r")){
freopen(taskname".inp", "r", stdin);
}
cin >> n;
for(int i = 1; i <= n; i++){
cin >> a[i];
a_sum += a[i];
}
a_max = *max_element(a + 1, a + n + 1);
if(n <= 12 || (n <= 30 && a_max <= 20)){
sub12::solve();
}
else{
sub3456::solve();
}
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |