제출 #1270817

#제출 시각아이디문제언어결과실행 시간메모리
1270817abdelhakim카니발 티켓 (IOI20_tickets)C++20
100 / 100
520 ms92836 KiB
#include "tickets.h"
#include <bits/stdc++.h>
#define dbg(x) cerr<<#x<<' '<<x<<endl;
#define ll long long 
using namespace std;
void printvec(vector<ll>& vec)
{
	for (auto &&e : vec)
	{
		cout << e << ' ';
	}
	cout << endl;
}
long long find_maximum(int k, std::vector<std::vector<int>> x) {
	int n = x.size();
	int m = x[0].size();
	ll ans=0;
	vector<ll> small(n);
	vector<ll> big(n,k);
	vector<pair<ll,ll>> v;
	vector<pair<ll,ll>> fe(n,{0,m-1});
	vector<vector<int>> anss(n,vector<int>(m,-1));
	for (int i=0;i<n;i++)
	{
		for (int j=m-1;j>=m-k;j--)
		{
			ans+=x[i][j];
		}
		for (int j=0;j<k;j++)
		{
			ll val=x[i][j]+x[i][m-k+j];
			v.push_back({val,i});
		}
	}
	sort(v.begin(), v.end());
	for (int i=0;i<n/2*k;i++)
	{
		small[v[i].second]++;
		big[v[i].second]--;
		ans-=v[i].first;
	}
	for (int i=0;i<k;i++)
	{
		vector<ll> vec(n);
		iota(vec.begin(),vec.end(),0);
		sort(vec.begin(), vec.end(), [&](ll ind1, ll ind2){return big[ind1] > big[ind2];});
		for (int j=0;j<n;j++)
		{
			if(j<n/2)
			{
				big[vec[j]]--;
				anss[vec[j]][fe[vec[j]].second]=i;
				fe[vec[j]].second--;
			}
			else
			{
				small[vec[j]]++;
				anss[vec[j]][fe[vec[j]].first]=i;
				fe[vec[j]].first++;
			}
		}
	}
	allocate_tickets(anss);
	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...