Submission #673211

#TimeUsernameProblemLanguageResultExecution timeMemory
673211US3RN4M3Uplifting Excursion (BOI22_vault)C++17
80 / 100
1943 ms7784 KiB
#include<bits/stdc++.h> using namespace std; using ll = long long; const int mx = 305; const int mx2 = mx*mx/2; const ll inf = 1e18; const ll ninf = -1e18; ll m, l; ll cnt_neg[mx]; ll cnt_pos[mx]; ll cnt_zero; ll dp[mx2*2]; ll cnt_pos_good[mx]; ll cnt_pos_bad[mx]; ll cnt_neg_good[mx]; ll cnt_neg_bad[mx]; void solve(ll target, ll cur_cnt_sum) { if(target >= mx2 || target < -mx2) { cout << "impossible" << endl; return; } dp[mx2 + target] = cur_cnt_sum; for(int i = 1; i <= m; i++) { /* positive good */ if(cnt_pos_good[i]) { for(int residue = 0; residue < i; residue++) { map<ll, ll> vals; vector<ll> history; ll t = 0; for(int cur_pos = residue; cur_pos < mx2*2; cur_pos += i) { ll tmp_val = dp[cur_pos] - t; if(vals.size()) dp[cur_pos] = max(dp[cur_pos], vals.rbegin()->first + t); vals[tmp_val]++; history.push_back(tmp_val); if(t >= cnt_pos_good[i]) { ll tmp = history[t - cnt_pos_good[i]]; vals[tmp]--; if(vals[tmp] == 0) vals.erase(tmp); } t++; } } } /* positive bad */ if(cnt_pos_bad[i]) { for(int residue = 0; residue < i; residue++) { map<ll, ll> vals; vector<ll> history; ll t = 0; for(int cur_pos = residue; cur_pos < mx2*2; cur_pos += i) { ll tmp_val = dp[cur_pos] + t; if(vals.size()) dp[cur_pos] = max(dp[cur_pos], vals.rbegin()->first - t); vals[tmp_val]++; history.push_back(tmp_val); if(t >= cnt_pos_bad[i]) { ll tmp = history[t - cnt_pos_bad[i]]; vals[tmp]--; if(vals[tmp] == 0) vals.erase(tmp); } t++; } } } /* negitive good */ if(cnt_neg_good[i]) { for(int residue = 0; residue < i; residue++) { map<ll, ll> vals; vector<ll> history; ll t = 0; for(int cur_neg = mx2*2 - 1 - residue; cur_neg >= 0; cur_neg -= i) { ll tmp_val = dp[cur_neg] - t; if(vals.size()) dp[cur_neg] = max(dp[cur_neg], vals.rbegin()->first + t); vals[tmp_val]++; history.push_back(tmp_val); if(t >= cnt_neg_good[i]) { ll tmp = history[t - cnt_neg_good[i]]; vals[tmp]--; if(vals[tmp] == 0) vals.erase(tmp); } t++; } } } /* negitive bad */ if(cnt_neg_bad[i]) { for(int residue = 0; residue < i; residue++) { map<ll, ll> vals; vector<ll> history; ll t = 0; for(int cur_neg = mx2*2 - 1 - residue; cur_neg >= 0; cur_neg -= i) { ll tmp_val = dp[cur_neg] + t; if(vals.size()) dp[cur_neg] = max(dp[cur_neg], vals.rbegin()->first - t); vals[tmp_val]++; history.push_back(tmp_val); if(t >= cnt_neg_bad[i]) { ll tmp = history[t - cnt_neg_bad[i]]; vals[tmp]--; if(vals[tmp] == 0) vals.erase(tmp); } t++; } } } } if(dp[mx2] < 0) cout << "impossible" << endl; else cout << dp[mx2] << endl; } void eq() { ll total_cnt = cnt_zero; for(int i = 1; i <= m; i++) { total_cnt += cnt_neg[i] + cnt_pos[i]; } cout << total_cnt << endl; exit(0); } void more_pos() { ll sum_neg = l; for(int i = 1; i <= m; i++) { sum_neg += cnt_neg[i] * i; } /* binary search: */ ll cnt_pos_used = 0; for(ll delta = (1ll<<60); delta >= 1; delta >>= 1) { ll test_value = cnt_pos_used + delta; ll cur_sum = 0; ll remaining = test_value; for(int i = 1; i <= m; i++) { if(cnt_pos[i] >= remaining) { cur_sum += remaining * i; remaining = 0; break; } else { cur_sum += cnt_pos[i] * i; remaining -= cnt_pos[i]; } } if(remaining > 0) continue; if(cur_sum < sum_neg) cnt_pos_used = test_value; } cnt_pos_used++; ll target = -sum_neg; ll remaining = cnt_pos_used; ll ans = cnt_pos_used + cnt_zero; for(int i = 1; i <= m; i++) { if(remaining <= cnt_pos[i]) { cnt_pos_good[i] = cnt_pos[i] - remaining; cnt_neg_bad[i] = remaining; target += remaining * i; remaining = 0; } else { cnt_neg_bad[i] = cnt_pos[i]; target += cnt_pos[i] * i; remaining -= cnt_pos[i]; } cnt_pos_bad[i] = cnt_neg[i]; ans += cnt_neg[i]; } solve(target, ans); } void more_neg() { for(int i = 1; i <= m; i++) { swap(cnt_pos[i], cnt_neg[i]); } l *= -1; more_pos(); } main() { for(int i = 0; i < mx2*2; i++) dp[i] = ninf; cin >> m >> l; ll sum_pos = 0; ll sum_neg = 0; for(int i = m; i >= 1; i--) { cin >> cnt_neg[i]; sum_neg += cnt_neg[i] * i; } cin >> cnt_zero; for(int i = 1; i <= m; i++) { cin >> cnt_pos[i]; sum_pos += cnt_pos[i] * i; } if(sum_pos < l) { cout << "impossible" << endl; return 0; } if(sum_pos - sum_neg == l) eq(); if(sum_pos - sum_neg > l) more_pos(); if(sum_pos - sum_neg < l) more_neg(); }

Compilation message (stderr)

vault.cpp:171:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  171 | main() {
      | ^~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...