Submission #1351141

#TimeUsernameProblemLanguageResultExecution timeMemory
1351141trideserSouvenirs (IOI25_souvenirs)C++20
100 / 100
8 ms412 KiB
#include "souvenirs.h"
#include <utility>
#include <vector>
#include <bits/stdc++.h>
using namespace std;

void clear(vector<pair<long long, vector<int>>>& prices, vector<long long>& solo, int index) {
	long long& ticksum = prices[index].first;
	vector<int>& tickvec = prices[index].second;
	for(int i = 0; i < tickvec.size(); i++) {
		if(solo[tickvec[i]] != -1) {
			ticksum -= solo[tickvec[i]];
			tickvec[i] = tickvec.back();
			tickvec.pop_back();
			i--;
		}
	}
	if(tickvec.size() == 1 && tickvec[0] == index) {
		solo[index] = ticksum;
		ticksum -= solo[tickvec[0]];
		tickvec.clear();
	}
}

void buy_souvenirs(int N, long long P0) {
	vector<pair<long long, vector<int>>> prices(N, make_pair(-1, vector<int>()));
	vector<long long> solo(N, -1);
	solo[0] = P0;
	prices[0] = make_pair(0, vector<int>());
	vector<int> purchased(N, 0);
	while(true) {
		int lastknown = N;
		for(int i = N - 1; i >= 0; i--) {
			if(prices[i].first != -1 && solo[i] == -1) {
				clear(prices, solo, i);
			}
			if(prices[i].first == -1) {
				break;
			}
			lastknown = i;
		}
		if(lastknown == 0) break;
		int tick = -1;
		for(int i = lastknown - 1; i >= 0; i--) {
			if(prices[i].first != -1) {
				tick = i;
				break;
			}
		}
		clear(prices, solo, tick);
		long long& ticksum = prices[tick].first;
		vector<int>& tickvec = prices[tick].second;
		long long query;
		if(solo[tick] != -1) {
			query = solo[tick] - 1;
		}
		else {
			query = ticksum / tickvec.size();
		}
		pair<vector<int>, long long> ans = transaction(query);
		prices[ans.first[0]] = make_pair(query - ans.second, ans.first);
		for(int a : ans.first) purchased[a]++;
	}
	for(int i = 0; i < N; i++) {
		while(purchased[i] < i) {
			transaction(solo[i]);
			purchased[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...