Submission #410461

#TimeUsernameProblemLanguageResultExecution timeMemory
410461534351Packing Biscuits (IOI20_biscuits)C++17
0 / 100
1097 ms1128 KiB
#include "biscuits.h"
#include <bits/stdc++.h>

using namespace std;

template<class T, class U>
void ckmin(T &a, U b)
{
    if (a > b) a = b;
}

template<class T, class U>
void ckmax(T &a, U b)
{
    if (a < b) a = b;
}

#define MP make_pair
#define PB push_back
#define LB lower_bound
#define UB upper_bound
#define fi first
#define se second
#define FOR(i, a, b) for (auto i = (a); i < (b); i++)
#define FORD(i, a, b) for (auto i = (a) - 1; i >= (b); i--)
#define SZ(x) ((int) (x).size())
#define ALL(x) (x).begin(), (x).end()

const int MAXN = 61;

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<pii> vpi;
typedef vector<pll> vpl;

int K;
ll X;
ll arr[MAXN], sum[MAXN];

ll solve(int e, ll mx)
{
	// cerr << "solve " << e << ' ' << mx << endl;
	if (e == 0)
	{
		return mx + 1;
	}
	ll c = sum[e], pw = (1ll << e);
	ckmin(mx, c);
	if (mx >= pw)
	{
		return solve(e - 1, pw - 1) + solve(e - 1, mx - pw);
	}
	else
	{
		return solve(e - 1, mx);
	}
	//the part mod 2^e can be at most c.
}

ll count_tastiness(ll x, vl a)
{
	X = x;
	K = SZ(a);
	FOR(i, 0, K)
	{
		arr[i] = a[i];
	}
	FOR(i, 0, K)
	{
		sum[i] = arr[i] * (1ll << i) + (i == 0 ? 0 : sum[i - 1]);
	}
	while(sum[K - 1] / X >= (1ll << K))
	{
		sum[K] = sum[K - 1];
		K++;
	}
	FOR(i, 0, K)
	{
		sum[i] /= X;
		ckmin(sum[i], (2ll << i) - 1);
		// cerr << "sum " << sum[i] << endl;
	}
	return solve(K - 1, (1ll << K) - 1);
	//try to count numbers by their earliest violation?
}
#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...