Submission #302897

#TimeUsernameProblemLanguageResultExecution timeMemory
302897urd05Carnival Tickets (IOI20_tickets)C++14
41 / 100
1633 ms92964 KiB
#include "tickets.h"
#include <vector>
#include <bits/stdc++.h>
using namespace std;

typedef pair<long long,int> P;

int zero[1500];
int one[1500];
int save[1500];
const int INF=1e9;
int getidx[1500][1500];

long long find_maximum(int k, vector<vector<int>> v) {
	int n = v.size();
	int m = v[0].size();
	vector<vector<int>> answer(n,vector<int>(m));
	priority_queue<P> pq;
	long long ret=0;
	for(int i=0;i<n;i++) {
	    zero[i]=min(2*k,m);
	    for(int j=0;j<m;j++) {
	        answer[i][j]=-1;
	        if (j<k||j>=m-k) {
	            pq.push(P(v[i][j],i));
	        }
	    }
	}
	for(int i=0;i<min((n*m)/2,n*k);i++) {
	    zero[pq.top().second]--;
	    pq.pop();
	}
	long long cut=pq.top().first;
	for(int i=0;i<n;i++) {
	    one[i]=min(2*k,m)-zero[i];
	    save[i]=zero[i];
	    int cnt=0;
	    for(int j=0;j<m;j++) {
	        if (j<k||j>=m-k) {
	            getidx[i][cnt++]=j;
	        }
	    }
	}
	for(int pos=0;pos<k;pos++) {
	    priority_queue<P> pq;
	    int pick=n/2;
	    vector<int> ind;
	    for(int i=0;i<n;i++) {
	        if (zero[i]==0) {
	            ind.push_back(i);
	            ret+=v[i][getidx[i][save[i]+one[i]-1]]-cut;
	            pick--;
	            continue;
	        }
	        ret+=cut-v[i][save[i]-zero[i]];
	        if (one[i]==0) {
	            continue;
	        }
	        long long big=v[i][getidx[i][save[i]+one[i]-1]]-cut;
	        pq.push(P(big-(cut-v[i][save[i]-zero[i]]),i));
	    }
	    for(int i=0;i<pick;i++) {
	        ret+=pq.top().first;
	        ind.push_back(pq.top().second);
	        pq.pop();
	    }
	    sort(ind.begin(),ind.end());
	    for(int i=0;i<n;i++) {
	        if (binary_search(ind.begin(),ind.end(),i)) {
	            answer[i][getidx[i][save[i]+one[i]-1]]=pos;
	            one[i]--;
	        }
	        else {
	            answer[i][getidx[i][save[i]-zero[i]]]=pos;
	            zero[i]--;
	        }
	    }
	}
	allocate_tickets(answer);
	return ret;
}
#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...