Submission #384338

#TimeUsernameProblemLanguageResultExecution timeMemory
384338amoo_safarMeetings (JOI19_meetings)C++17
29 / 100
1994 ms1024 KiB
#include "meetings.h"

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

mt19937 Amoo(chrono::steady_clock::now().time_since_epoch().count());

int rand(int bd){
	int res = bd;
	while(res == bd){
		res = uniform_int_distribution<int>(0, bd)(Amoo);
	}
	return res;
}
void bridge(int u, int v){
	if(u > v) swap(u, v);
	Bridge(u, v);
}

void solve(vector<int> V){
	// cerr << "! "; 
	// for(auto al : V) cerr << al << ' ';
	// cerr << '\n';
	int n = V.size();
	if(n == 1) return ;
	if(n == 2){
		bridge(V[0], V[1]);
		return ;
	}
	int a = rand(n);
	int b = a;
	while(b == a) b = rand(n);
	int c = a;
	while(c == a || c == b) c = rand(n);
	int rt = Query(V[a], V[b], V[c]);
	vector<int> Y;
	for(auto x : V) if(x != rt) Y.pb(x);
	vector<vector<int>> M;
	vector<int> mx;
	M.pb( {Y[0]} ); mx.pb(Y[0]);
	int res;
	for(int i = 1; i < (int) Y.size(); i++){
		int fl = 1;
		for(int j = 0; j < (int) mx.size(); j++){
			res = Query(rt, mx[j], Y[i]);
			if(res != rt){

				M[j].pb(Y[i]);
				if(res == Y[i])
					mx[j] = Y[i];
				fl = 0;
				break;
			}
		}
		if(fl){
			M.pb({Y[i]});
			mx.pb(Y[i]);
		}
	}
	for(auto u : mx)
		bridge(rt, u);
	for(auto I : M) solve(I);

}

void Solve(int N) {
	vector<int> A(N);
	iota(A.begin(), A.end(), 0);
	solve(A);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...