Submission #1328098

#TimeUsernameProblemLanguageResultExecution timeMemory
1328098hh69선물 (IOI25_souvenirs)C++20
100 / 100
12 ms400 KiB
#include "souvenirs.h"
#include <utility>
#include <vector>
#include <stack>

using pvi = std::pair<std::vector<int>, long long>;
using ll = long long;
std::vector<ll> fin;
std::vector<ll> counts;

void add(pvi& list){
	for(auto val: list.first)
		++counts[val];
}

void buy_souvenirs(int N, long long P0) {
	fin=std::vector<ll>(N, -1);
	counts=std::vector<ll>(N, 0);
	std::stack<pvi> st;
	st.push(transaction(P0-1));
	st.top().second=P0-1-st.top().second;
	add(st.top());
	while(!st.empty()){
		pvi& cur=st.top();
		while(cur.first.size()>1){
			if(fin[(cur.first)[cur.first.size()-1]]!=-1){
				cur.second-=fin[cur.first[cur.first.size()-1]];
				cur.first.pop_back();
			}
			else break;
		}
		if(cur.first.size()==1){
			ll ind=(cur.first)[0];
			fin[ind]=cur.second;
			if(ind<N-1&&fin[ind+1]==-1){
				st.push(transaction(fin[ind]-1));
				st.top().second=fin[ind]-1-st.top().second;
				add(st.top());
			}
			else
				st.pop();
		}
		else{
			ll next_cost=cur.second/(cur.first.size());
			st.push(transaction(next_cost));
			st.top().second=next_cost-st.top().second;
			add(st.top());
		}
	}
	for(int i=0; i < N; ++i){
		while(counts[i]<i){
			transaction(fin[i]);
			++counts[i];
		}
	}
	return;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...