Submission #648773

#TimeUsernameProblemLanguageResultExecution timeMemory
648773ymmPacking Biscuits (IOI20_biscuits)C++17
100 / 100
561 ms1356 KiB
#include "biscuits.h" #include <bits/stdc++.h> #define Loop(x,l,r) for (ll x = (l); x < (ll)(r); ++x) #define LoopR(x,l,r) for (ll x = (r)-1; x >= (ll)(l); --x) typedef long long ll; typedef std::pair<int, int> pii; typedef std::pair<ll , ll > pll; using namespace std; const int K = 130; vector<pll> dif[K]; ll cnt[K]; ll x; ll f(int i, ll x) { auto it = upper_bound(dif[i].begin(), dif[i].end(), pll{x, 2e18}); --it; return it->second; } ll f_next(int i, ll x) { ll val = 0; val += f(i+1, cnt[i+1] + x/2); if (x>=::x) { ll mv = x-::x; val += f(i+1, cnt[i+1] + mv/2); } return val; } ll get_next(int i, ll pre, ll pre_val) { ll l = pre+1; ll r = 2*x+2; while (l<r) { ll mid = (l+r)/2; ll val = f_next(i, mid); if (val > pre_val) r = mid; else l = mid+1; } return l; } long long count_tastiness(long long x, std::vector<long long> a) { ::x = x; Loop (i,0,a.size()) cnt[i] = a[i]; Loop (i,a.size(),K) cnt[i] = 0; Loop (i,0,K-1) { ll mv = cnt[i]-x; if (mv <= 1) continue; mv &= -2; cnt[i] -= mv; cnt[i+1] += mv/2; } dif[K-1] = {{0, 1}, {x, 2}, {2*x, 3}}; LoopR (i,0,K-1) { ll pre = 0, pre_val = f(i+1, cnt[i+1]); dif[i] = {{pre, pre_val}}; for (;;) { ll nxt = get_next(i, pre, pre_val); if (nxt == 2*x+2) break; pre = nxt; pre_val = f_next(i, nxt); //printf("%d %ld %ld\n", i, pre, pre_val); dif[i].push_back({pre, pre_val}); } } return f(0, cnt[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...