# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
429142 | koioi.org-koosaga | Meetings (JOI19_meetings) | C++17 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "meetings.h"
#include <bits/stdc++.h>
using namespace std;
using pi = pair<int, int>;
#define sz(v) ((int)(v).size())
mt19937 rng(0x14004);
int randint(int lb, int ub){ return uniform_int_distribution<int>(lb, ub)(rng); }
void bridge(int x, int y){ Bridge(min(x, y), max(x, y)); }
void dfs(vector<int> v){
if(v.size() == 1) return;
if(v.size() == 2){
bridge(v[0], v[1]);
return;
}
shuffle(v.begin(), v.end(), rng);
vector<pi> ords;
ords.emplace_back(v[0], v[0]);
ords.emplace_back(v[1], v[1]);
for(int i=2; i<v.size(); i++){
int q = Query(v[0], v[1], v[i]);
ords.emplace_back(q, i);
}
sort(ords.begin(), ords.end(), [&](pi a, pi b){
if(a.first != b.first) return Query(v[0], a.first, b.first) == a.first;
return a.second < b.second;
});
for(int i = 0; i < sz(ords); ){
int e = i;
while(e < sz(ords) && ords[i].first == ords[e].first){
w.push_back(ords[e++].second);
}
dfs(w);
if(e < sz(ords)) bridge(ords[i].first, ords[e].first);
i = e;
}
}
void Solve(int N) {
vector<int> v(N);
iota(v.begin(), v.end(), 0);
dfs(v);
}