Submission #1052530

#TimeUsernameProblemLanguageResultExecution timeMemory
1052530noyancanturkPacking Biscuits (IOI20_biscuits)C++17
44 / 100
10 ms968 KiB
#include "biscuits.h"

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

using lint=long long;
using llint=__int128_t;

llint inf=1e20;

lint count_tastiness(lint x,vector<lint> a) {
	int n=a.size();
	llint b[n+31]{};
	llint need[n+31];
	need[0]=x;
	for(int i=1;i<n+31;i++){
		need[i]=need[i-1]*2;
	}
	for(int i=0;i<n+31;i++){
		if(i<n)b[i]+=a[i];
		if(x<b[i]){
			b[i+1]=(b[i]-x)/2;
			b[i]=x+((b[i]-x)&1);
		}
		//cerr<<lint(b[i])<<" ";
	}//cerr<<"\n";
	llint dp[n+31]{};
	llint dppref[n+31];
	for(int i=0;i<n+31;i++){
		if(x<=b[i]){
			if(i)dp[i]=dppref[i-1];
			else dp[i]=1;
		}else{
			dp[i]=0;
			llint neednow=x;
			for(int j=i;0<=j;j--){
				neednow-=b[j];
				if(neednow<=0){
					neednow=x+neednow;
					if(neednow<=0){
						dp[i]+=dppref[j];
						break;
					}else if(j)dp[i]+=dppref[j-1];
					else dp[i]++;
				}
				neednow*=2;
				if(inf<neednow)break;
			}
		}
		dppref[i]=dp[i];
		if(i)dppref[i]+=dppref[i-1];
		else dppref[i]++;
	}
	llint ans=1;
	for(int i=0;i<n+31;i++){
		ans+=dp[i];
		//if(i<5)cerr<<lint(dp[i])<<" "<<lint(dppref[i])<<" "<<i<<" dpval\n";
	}
	return ans;
}

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