Submission #830566

#TimeUsernameProblemLanguageResultExecution timeMemory
830566amunduzbaevPacking Biscuits (IOI20_biscuits)C++17
100 / 100
10 ms1336 KiB
#include "biscuits.h"

#include "bits/stdc++.h"
using namespace std;

#define ar array
typedef long long ll;
//~ #defien int ll

ll count_tastiness(ll x, vector<ll> a) {
	
	int k = 60;
	a.resize(k);
	vector<ll> pref(k);
	for(int i=0;i<k;i++){
		if(i) pref[i] = pref[i - 1];
		pref[i] += a[i] * (1ll << i);
	}
	for(int i=0;i<k;i++){
		pref[i] /= x;
	}
	
	//~ for(int i=0;i<k;i++){
		//~ cout<<pref[i]<<" ";
	//~ }
	//~ cout<<"\n";
	
	ll sum = 1;
	vector<ll> dp(k), L(k), toob(k);
	
	for(int i=0;i<k;i++){
		L[i] = (1ll << (i + 1));
		if(pref[i] < (1ll << i)){
			L[i] = (1ll << i);
			continue;
		} 
		L[i] = min(L[i], pref[i] + 1);
		ll L_ = L[i] - (1ll << i);
		dp[i] = sum;
		
		for(int j=i - 1;~j;j--){
			if(L_ <= (1ll << j)){
				toob[i] += dp[j];
			} else {
				if(L[j] <= L_) break;
				else toob[i] -= toob[j], L_ -= (1ll << j);
			}
		}
		
		dp[i] -= toob[i];
		
		sum += dp[i];
	}
	
	//~ for(int i=0;i<5;i++){
		//~ cout<<pref[i]<<" ";
	//~ } cout<<"\n";
	//~ for(int i=0;i<5;i++){
		//~ cout<<L[i]<<" ";
	//~ } cout<<"\n";
	
	//~ for(int i=0;i<5;i++){
		//~ cout<<dp[i]<<" ";
	//~ } cout<<"\n";
	//~ for(int i=0;i<5;i++){
		//~ cout<<toob[i]<<" ";
	//~ } cout<<"\n";
	
	return sum;
}

#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...