Submission #1292750

#TimeUsernameProblemLanguageResultExecution timeMemory
1292750lambd47Packing Biscuits (IOI20_biscuits)C++20
100 / 100
8 ms888 KiB
#include<bits/stdc++.h>
#include "biscuits.h"
using namespace std;

#define L(i,j,k) for(int i=(j);i<=(k);i++)
#define R(i,j,k) for(int i=(j);i>=(k);i--)
#define sz(v) ((int)(v).size())
#define all(v) (v).begin(),(v).end()
#define ll long long


long long count_tastiness(long long x, std::vector<long long> vec) {
	int z=sz(vec);
	L(i,0,sz(vec)-1){
		if(i==sz(vec)-1 && vec[i]!=0)vec.push_back(0);
		if(vec[i]>x){
			ll a=vec[i]-x;
			vec[i]-=(a/2)*2;
			vec[i+1]+=(a/2);
		}
		//if(vec[i]==x+1)vec[i]--;
	}
	//for(auto a:vec)cout<<a<<" ";
	int k=sz(vec);
	vector<ll> preresp(k);//calculo 
	//alias, transformo o cara em 1 e depois pego ele
	//so pucho nos caras que sei que vou conseguir ganhar
	auto dp=[&](auto&& self,int id, ll val)->ll{// dado que to decidindo oq fazer no id e com o valor val nele, quantos numeros da
		if(id==0){
			if(val>=x)return (ll)2;
			else return (ll)1;
		}
		if(val>=x){
			return 2*preresp[id-1];//ativo e nao ativo
		}
		//testo pra ver se consigo transformar em 1
		ll quero=x-val;
		R(i,id-1,0){
			if(quero>2*x)continue;//pra nao estourar esse bicho
			quero*=2;
			if(quero<=vec[i]){
				return preresp[id-1]+self(self,i,vec[i]-quero);//nao ativo e ativo
			}
			quero-=vec[i];
		}
		//ahhh nao vou conseguir ativar
		return preresp[id-1];
	};
	L(i,0,k-1){
		preresp[i]=dp(dp,i,vec[i]);
		//cout<<preresp[i]<<" ";
	}
	return preresp[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...