제출 #304806

#제출 시각아이디문제언어결과실행 시간메모리
304806arthur_nascimento카니발 티켓 (IOI20_tickets)C++14
100 / 100
1074 ms54520 KiB
#include "tickets.h"
#include <vector>
#include <bits/stdc++.h>
using namespace std;
#define maxn 1515
#define pii pair<int,int>

int ini[maxn];
int fim[maxn];

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;

	for (int i = 0; i < n; i++) {
		std::vector<int> row(m);
		for (int j = 0; j < m; j++) {
			row[j] = -1;
		}
		answer.push_back(row);
	}

	long long ans = 0;

	set<pii> S;

	for(int i=0;i<n;i++){
		for(int j=m-k;j<m;j++){
			ans += x[i][j];
			answer[i][j] = -2;
		}
		ini[i] = 0;
		fim[i] = m-k;
		S.insert({x[i][ini[i]] + x[i][fim[i]],i});
	}	

	for(int i=0;i<(k*n)/2;i++){
		pii u = *S.begin();
		S.erase(S.begin());
		ans -= u.first;
		int id = u.second;
		
		
		answer[id][fim[id]] = -1;
		answer[id][ini[id]] = -3;
		fim[id]++;ini[id]++;
		
		
		if(fim[id] < m){
			S.insert({x[id][ini[id]] + x[id][fim[id]],id});
		}
	}

	int cur = 0, curcur = 0;
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			if(answer[i][j] == -3){
				answer[i][j] = cur;
				cur = (cur+1) % k;
				curcur = cur;
			}
			if(answer[i][j] == -2){
				answer[i][j] = curcur;
				curcur = (curcur+1) % k;
			}

		}
		//cur = curcur;
	}
	
	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...