Submission #1348570

#TimeUsernameProblemLanguageResultExecution timeMemory
1348570Faisal_Saqib카니발 티켓 (IOI20_tickets)C++17
25 / 100
500 ms67608 KiB
#include "tickets.h"
#include <vector>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1501;
int cnt[N],lst[N];
vector<int> add[N],mns[N];
long long find_maximum(int k, std::vector<std::vector<int>> x) {
	int n = x.size();
	int m = x[0].size();
	std::vector<std::vector<int>> answer;
	set<pair<int,int>> fst;
	for (int i = 0; i < n; i++) {
		cnt[i]=0;

		lst[i]=m;
		fst.insert({x[i][--lst[i]],i});

		add[i].clear();
		mns[i].clear();
		std::vector<int> row(m,-1);
		answer.push_back(row);
	}
	ll ans=0;
	int tot=n/2 * k;
	while(tot>0)
	{
		auto it=*rbegin(fst);
		int i=it.second;
		fst.erase(--end(fst));
		if(cnt[i]==k)continue;
		add[i].push_back(lst[i]);
		tot--;
		cnt[i]++;
		ans+=it.first;
		fst.insert({x[i][--lst[i]],i});
	}
	tot=n/2 * k;
	fst.clear();
	for(int i=0;i<n;i++)
	{
		lst[i]=0;
		fst.insert({x[i][lst[i]++],i});
	}

	while(tot>0)
	{
		auto it=*begin(fst);
		int i=it.second;
		fst.erase(begin(fst));
		if(cnt[i]==k)continue;
		mns[i].push_back(lst[i]-1);
		tot--;
		cnt[i]++;
		ans-=it.first;
		fst.insert({x[i][lst[i]++],i});
	}

	int l=0;
	for(int i=0;i<n;i++)
	{
		for(auto j:add[i])
		{
			answer[i][j]=(l++)%k;
		}
		int r=l;
		for(auto j:mns[i])
		{
			answer[i][j]=(r++)%k;
		}
	}
	allocate_tickets(answer);
	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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...