Submission #1242220

#TimeUsernameProblemLanguageResultExecution timeMemory
1242220KindaGoodGamesTeams (IOI15_teams)C++20
0 / 100
4108 ms589824 KiB
#include "teams.h"
#include<bits/stdc++.h>

using namespace std;

#define pii pair<int,int>

int n;
vector<pii> arr;

void init(int N, int A[], int B[]) {
	n = N;
	arr.resize(n);
	for(int i = 0; i < n; i++){
		arr[i] = {A[i], B[i]};
	}
}

bool doMatch(int v, vector<int>& from, vector<vector<int>>& adj, vector<bool>& vis){
	if(vis[v]) return false;
	vis[v] = true;
	for(auto u : adj[v]){  
		if(from[u] == -1 || doMatch(from[u],from,adj,vis)){
			from[u] = v;
			return true;
		}
	} 
	return false;
}

int can(int m, int sizes[]) {
	vector<int> K(m);
	for(int i = 0; i < m; i++){
		K[i] = sizes[i];
	}
	int s = 0;
	for(int i = 0; i < m; i++){
		s += K[i];
	}
	if(s > n){
		return false;
	}

	vector<vector<int>> adj(n);
	int pt = 0;
	for(int i = 0; i < m; i++){
		for(int j = 0; j < n; j++){
			if(arr[j].first <= K[i] && K[i] <= arr[j].second){
				for(int k = 0; k < K[i]; k++){ 
					adj[j].push_back(pt+k);
				}
			} 
		}
		pt += K[i];
	}

	vector<bool> vis(n);
	vector<int> from(s, -1); 

	for(int i = 0; i < n; i++){
		for(auto u : adj[i]){
			if(from[u] == -1){
				from[u] = i;
				break;
			}
		}
	}

	for(int i = 0; i < n; i++){
		fill(vis.begin(),vis.end(),0);
		doMatch(i,from, adj,vis);
	}

	for(int i = 0; i < s; i++){
		if(from[i] == -1){
			return false;
		}
	}
	return true;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...