제출 #1125685

#제출 시각아이디문제언어결과실행 시간메모리
1125685OI_AccountMeetings (JOI19_meetings)C++20
100 / 100
1022 ms2008 KiB
#include "meetings.h" #include <bits/stdc++.h> using namespace std; const int N = 2000; mt19937 rng(time(0)); int ucmp; void write(int u, int v) { u--, v--; Bridge(min(u, v), max(u, v)); } int get(int u, int v, int w) { return Query(u - 1, v - 1, w - 1) + 1; } void solveSmall(vector<int> vec) { if (vec.size() == 1) return; if (vec.size() == 2) { write(vec[0], vec[1]); return; } int x = get(vec[0], vec[1], vec[2]); for (auto y: vec) if (x != y) write(x, y); } bool cmp(int x, int y) { return get(ucmp, x, y) == x; } void checkPath(vector<int> path, int u, int v) { ucmp = u; sort(path.begin(), path.end(), cmp); for (int i = 1; i < path.size(); i++) write(path[i - 1], path[i]); if (path.size() == 0) write(u, v); else { write(u, path[0]); write(path.back(), v); } } void solve(vector<int> vec) { if (vec.size() <= 3) { solveSmall(vec); return; } shuffle(vec.begin(), vec.end(), rng); int u = vec[0], v = vec[1]; vector<int> path, x[N + 10]; for (int i = 2; i < vec.size(); i++) { int w = get(u, v, vec[i]); x[w].push_back(vec[i]); if (w == vec[i]) path.push_back(w); } checkPath(path, u, v); x[u].push_back(u); x[v].push_back(v); for (auto u: vec) if (x[u].size()) solve(x[u]); } void Solve(int N) { vector<int> vec; for (int i = 1; i <= N; i++) vec.push_back(i); solve(vec); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...