제출 #333697

#제출 시각아이디문제언어결과실행 시간메모리
333697LucaDantasMeetings (JOI19_meetings)C++17
29 / 100
2997 ms904 KiB
#include<bits/stdc++.h>
using namespace std;
#include "meetings.h"

#define pb push_back
#define sz(a) (a).size()

std::mt19937 rng(std::chrono::steady_clock::now().time_since_epoch().count() ^ (long long) (make_unique<char>().get()));

constexpr int maxn = 2e3+10;

void solve(vector<int>& a) {
	if(sz(a) <= 1) return;
	if(sz(a) == 2) return (void)(Bridge(min(a[0], a[1]), max(a[0], a[1])));
	int divide = Query(a[0], a[1], a[2]);
	vector<int> head;
	if(divide == a[0]) head.pb(a[1]);
	else head.pb(a[0]);
	vector<vector<int>> grp;
	map<int,int> id;
	id[head[0]] = 0;
	grp.pb({head[0]});
	for(int x : a) {
		if(x != divide) {
			bool ok = 0;
			for(int y : head) {
				if(x != y) {
					if(Query(divide, x, y) != divide)
						ok = 1, grp[id[y]].pb(x);
				} else ok = 1;
			}
			if(!ok) id[x] = sz(head), head.pb(x), grp.pb({x});
		}
	}
	for(int y : head) {
		int top = y;
		for(int x : grp[id[y]])
			if(x != top)
				top = Query(divide, x, top);
		Bridge(min(divide, top), max(divide, top));
		solve(grp[id[y]]);
	}
}

void Solve(int n) {
	vector<int> a;
	for(int i = 0; i < n; i++)
		a.pb(i);
	shuffle(a.begin(), a.end(), rng);
	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...