Submission #392195

#TimeUsernameProblemLanguageResultExecution timeMemory
392195johuthaPacking Biscuits (IOI20_biscuits)C++17
0 / 100
5 ms332 KiB
#include "biscuits.h" #include <iostream> #define int long long using namespace std; int count_tastiness(int x, vector<int> a) { vector<int> dpref(63); vector<int> vpref(63); vector<int> dp(62); a.resize(64); int v = 0; int pw = 1; for (int i = 0; i < 62; i++, pw *= 2) { v += a[i]*pw; vpref[i] = v; int b = v - pw*x; int np = pw / 2; // cerr << "Starting " << i << ": " << v << " " << b << "\n"; for (int j = i - 1; j >= 0; j--, np /= 2) { // cerr << " -> " << j << " " << b << " " << np << "\n"; if (b >= np*x && vpref[j] >= np * x) { b -= np*x; dp[i] += 1 + dpref[j]; } } if (b >= 0) dp[i]++; dpref[i + 1] = dpref[i] + dp[i]; // cerr << i << " " << dp[i] << " " << dpref[i] << "\n"; } return dpref.back() + 1; } using namespace std; using ll = long long; using ull = unsigned long long; const ull INF = 2e18+1; ll count_correct(ll _x, vector<ll> _a) { ull x = _x; int k = _a.size(); vector<ull> a(k+60, 0); for(int i=0; i<k; ++i) a[i] = _a[i]; k+=60; vector<ull> dp(k), dp0(k), pref(k); pref[0] = a[0]; for(int i=1; i<k; ++i) { pref[i] = pref[i-1]/2 + a[i]; } for(int i=0; i<k; ++i) { if(i>0) { dp0[i] = dp[i-1]; } else { dp0[i] = 1; } ull sum = 0; dp[i] = 1; for(int j=i; j>=0; --j) { if(pref[j] >= x + sum) { dp[i] += dp0[j]; if(sum < INF && sum + x < INF) { sum += x; if(a[j] > sum) sum = 0; else sum -= a[j]; sum *= 2; } else { sum = INF; } } else { if(a[j] > sum) sum = 0; else sum -= a[j]; if(sum < INF) sum *= 2; else sum = INF; } } } return dp[k-1]; }
#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...