Submission #1065125

#TimeUsernameProblemLanguageResultExecution timeMemory
1065125pawnedTeams (IOI15_teams)C++17
34 / 100
4065 ms42428 KiB
#pragma GCC optimize("O1,O2,O3,Ofast,unroll-loops")

#include <bits/stdc++.h>
using namespace std;

#define fi first
#define se second
#define pb push_back
typedef long long ll;
typedef pair<int, int> ii;
typedef vector<int> vi;

#include "teams.h"

const int MAX = 1e5 + 5;	// change to 1e5 + 5 later

int N;
vector<ii> allp;

void init(int N_g, int A_g[], int B_g[]) {
	N = N_g;
	for (int i = 0; i < N; i++) {
		allp.pb({A_g[i], B_g[i]});
	}
}

int can(int M, int K_g[]) {
	vi teams;
	for (int i = 0; i < M; i++) {
		teams.pb(K_g[i]);
	}
	sort(teams.begin(), teams.end());
	multiset<int> tr1[MAX];	// all end with start equal to i
	multiset<int> tr2[MAX];	// all start with end equal to i
	for (ii p : allp) {
		tr1[p.fi].insert(p.se);
		tr2[p.se].insert(p.fi);
	}
	multiset<ii> have;	// all eligible {end, start}
	// at each time, get best
	int curr = 0;	// minimum start
	for (int i = 0; i < M; i++) {
//		cout<<"at "<<i<<endl;
		for (int j = curr + 1; j <= teams[i]; j++) {	// add starting w/ j
			for (int x : tr1[j]) {
//				cout<<"inserting "<<x<<" "<<j<<endl;
				have.insert({x, j});
			}
		}
		for (int j = curr; j < teams[i]; j++) {	// remove ending w/ j
			for (int x : tr2[j]) {
				have.erase(have.find({j, x}));
			}
			tr2[j].clear();
		}
		curr = teams[i];
		for (int j = 0; j < teams[i]; j++) {	// find team[i] of val team[i]
//			cout<<"j: "<<j<<endl;
			if (have.size() == 0)	// run out
				return 0;
			ii minv = *(have.begin());	// lowest end, greedy
//			cout<<"minv: "<<minv.fi<<", "<<minv.se<<endl;
			have.erase(have.find(minv));
			tr1[minv.se].erase(tr1[minv.se].find(minv.fi));
			tr2[minv.fi].erase(tr2[minv.fi].find(minv.se));
		}
	}
	return 1;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...