Submission #833558

#TimeUsernameProblemLanguageResultExecution timeMemory
833558Sohsoh84Packing Biscuits (IOI20_biscuits)C++17
100 / 100
12 ms1292 KiB
#include "biscuits.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; #define sep ' ' #define debug(x) cerr << #x << ": " << x << endl; const int MAXN = 61; // TODO inline bool ovf_mul(ll a, ll b) { ll mx = numeric_limits<ll>::max(); return b > mx / a; } ll A[MAXN], dp[MAXN], ps[MAXN], x; inline ll f(ll i, ll mask) { if (i == 0) return (mask == 0 ? 1 : dp[i]); if (mask >= (1ll << (i + 1))) return dp[i]; if (!(mask >> i & 1ll)) return f(i - 1, mask); ll tmask = mask ^ (1ll << i); if (A[i] >= x) return f(i - 1, tmask) + dp[i - 1]; ll fmask = ps[i] / x - (1ll << i); if (fmask < 0) return dp[i - 1]; return dp[i - 1] + f(i - 1, min(fmask, tmask)); } ll count_tastiness (ll x_, vector<ll> a_) { x = x_; memset(A, 0, sizeof A); memset(dp, 0, sizeof dp); memset(ps, 0, sizeof ps); for (int i = 0; i < int(a_.size()); i++) { A[i] = a_[i]; ps[i] = (A[i] << i); } dp[0] = (A[0] >= x ? 2 : 1); for (int i = 1; i < MAXN; i++) { ps[i] += ps[i - 1]; dp[i] = dp[i - 1]; ll m = ps[i] / x - (1ll << i); if (m >= 0) dp[i] += f(i - 1, m); } return dp[MAXN - 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...