Submission #787070

#TimeUsernameProblemLanguageResultExecution timeMemory
787070Pablo_NoCarnival Tickets (IOI20_tickets)C++17
27 / 100
657 ms214136 KiB
    #include "tickets.h"
    #include <vector>
    #include <set>
    #include <algorithm>
    #include <iostream>
     
    using namespace std;
     
    #define int long long
     
    bool cmp(pair<pair<pair<int, int>, pair<int, int>>, int> a, pair<pair<pair<int, int>, pair<int, int>>, int> b)
    {
    	return a.first.first.first+a.first.second.first < b.first.second.first+b.first.first.first;

    }
     
    long long find_maximum(signed k, std::vector<std::vector<signed>> x) {
    	int n = x.size();
    	int m = x[0].size();
     
    	std::vector<std::vector<signed>> ans(n, vector<signed>(m, -1));
    	long long ansv = 0;
     
    	vector<multiset<pair<int, int>>> sx(n);
     
    	for (int i = 0; i < n; i++) {
    		for(int j = 0; j < m; j++)
    			sx[i].insert({x[i][j], j});
    	}
     
    	for(int as = 0; as < k; as++)
    	{
    		vector<pair<pair<pair<int, int>, pair<int, int>>, int>> poss;
    		for(int i = 0; i < n; i++)
    		{
    			poss.push_back({{*sx[i].begin(), *sx[i].rbegin()}, i});
    		}
    		sort(poss.begin(), poss.end(), cmp);
    		int mv = poss[n/2-1].first.first.first;
    		for(int i = 0; i < n/2; i++)
    		{
    			//cout << poss[i].first.first.first << ' ' << poss[i].first.first.second << '\n';
    			ansv += mv-poss[i].first.first.first;
    			ans[poss[i].second][poss[i].first.first.second] = as;
    			if(sx[poss[i].second].find({poss[i].first.first.first, poss[i].first.first.second}) != sx[poss[i].second].end())
    				sx[poss[i].second].erase(sx[poss[i].second].find({poss[i].first.first.first, poss[i].first.first.second}));
    		}
    		for(int i = n/2; i < n; i++)
    		{
    			//cout << poss[i].first.second.first << ' ' << poss[i].first.second.second << '\n';
    			ansv += poss[i].first.second.first-mv;
    			ans[poss[i].second][poss[i].first.second.second] = as;
    			if(sx[poss[i].second].find({poss[i].first.second.first, poss[i].first.second.second}) != sx[poss[i].second].end())
    				sx[poss[i].second].erase(sx[poss[i].second].find({poss[i].first.second.first, poss[i].first.second.second}));
    		}
    	}
     
    	allocate_tickets(ans);
    	return ansv;
    }
#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...