제출 #1142890

#제출 시각아이디문제언어결과실행 시간메모리
1142890PagodePaiva카니발 티켓 (IOI20_tickets)C++20
27 / 100
328 ms89920 KiB
#include<bits/stdc++.h>
#include "tickets.h"
#include <vector>

using namespace std;

const int N = 1510;
const long long inf = 1e18;
int ans[N][N];
long long l[N], r[N];
int idxl[N], idxr[N];
long long dp[N][N];
long long cnt[N];
set <int> linhas;
long long best[N][N];

long long find_maximum(int k, std::vector<std::vector<int>> x) {
	memset(ans, -1, sizeof ans);
	int at = 0;
	long long res = 0;
	int n = x.size();
	int m = x[0].size();
	while(k > 0){
		vector <array <long long, 3>> valores;
		for(int i = 0;i < n;i++){
			int j = 0;
			while(ans[i][j] != -1) j++;
			l[i] = x[i][j];
			idxl[i] = j;
			j = m-1;
			while(ans[i][j] != -1) j--;
			r[i] = x[i][j];
			idxr[i] = j;
			valores.push_back({l[i], i, 0});
			valores.push_back({r[i], i, 1});
			linhas.insert(i);
		}
		sort(valores.begin(),valores.end());
		int qtdmin = n/2;
		memset(cnt, 0, sizeof cnt);
		for(int i = 0;i < n;i++){
			cnt[valores[i][1]]++;
			if(cnt[valores[i][1]] == 2){
				ans[valores[i][1]][idxl[valores[i][1]]] = at;
				res -= l[valores[i][1]];
				linhas.erase(valores[i][1]);
				qtdmin--;
			}
		}
		for(int i = 0;i < n;i++){
			if(cnt[i] == 0){
				ans[i][idxr[i]] = at;
				linhas.erase(i);
				res += r[i];
			}
		}
		int con = 1;
		dp[0][0] = 0;
		for(int i = 1;i <= qtdmin;i++){
			dp[0][i] = -inf;
		}
		for(auto x : linhas){
			for(int i = 0;i <= qtdmin;i++){
				dp[con][i] = dp[con-1][i]+r[x];
				best[con][i] = i;
				if(i > 0)
					if(dp[con][i] < dp[con-1][i-1]-l[x]){
					dp[con][i] = dp[con-1][i-1]-l[x];
					best[con][i] = i-1;
				}
			}
			con++;
		}
		con--;
		res += dp[con][qtdmin];
		while(con > 0){
			auto it = linhas.end();
			it--;
			linhas.erase(it);
			int x = *it;
			if(best[con][qtdmin]-qtdmin == 0){
				ans[x][idxr[x]] = at;
			}
			else{
				ans[x][idxl[x]] = at;
				qtdmin--;
			}
			con--;
		}
		at++;
		k--;
	}
	vector <vector <int>> answer;
	for(int i = 0;i < n;i++){
		vector <int> aux;
		for(int j = 0;j < m;j++){
			aux.push_back(ans[i][j]);
		}
		answer.push_back(aux);
	}
	allocate_tickets(answer);
	return res;
}
#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...