#include <bits/stdc++.h>
#include "meetings.h"
using namespace std;
typedef long long ll;
int p, k;
bool comp(const int &i1, const int &i2){
if(Query(p, i1, i2) == i1) return true;
return false;
}
void odpowiedz(int a, int b){
if(a > b) swap(a, b);
Bridge(a, b);
return;
}
vector<int> posortuj(int a, vector<int> sciezka, int b){
p = a;
k = b;
sort(sciezka.begin(),sciezka.end(),comp);
return sciezka;
}
void rozw(vector<int> curr, int root){
if(curr.size() == 1) { odpowiedz(curr[0], root); return; }
if(curr.size() == 0) { return; }
int los = curr[rand() % curr.size()];
vector<int> nasciezce;
vector<int> odpowiedzi;
for(auto u : curr){
if(u == los){
odpowiedzi.push_back(-1);
continue;
}
odpowiedzi.push_back(Query(los, u, root));
if(odpowiedzi.back() == u) nasciezce.push_back(u);
}
vector<vector<int>> podd;
vector<int> v1;
vector<int> v2;
vector<int> sor = posortuj(los, nasciezce, root);
odpowiedz(los, sor[0]);
for(int i = 0; i < sor.size()-1; ++i){
odpowiedz(sor[i], sor[i+1]);
}
odpowiedz(sor.back(), root);
vector<int> ind(sor.size());
for(int i = 0; i < sor.size(); ++i){
ind[sor[i]] = i;
}
podd.resize(nasciezce.size());
for(int i = 0; i < curr.size(); ++i){
if(curr[i] == los or odpowiedzi[i] == curr[i]) continue;
if(odpowiedzi[i] == los) v1.push_back(curr[i]);
else if(odpowiedzi[i] == root) v2.push_back(curr[i]);
else podd[ind[odpowiedzi[i]]].push_back(curr[i]);
}
rozw(v1, los);
rozw(v2, root);
for(int i = 0; i < sor.size(); ++i){
rozw(podd[i], sor[i]);
}
return;
}
void Solve(int N){
int n = N;
vector<int> curr;
int root = 0;
for(int i = 1; i < n; ++i){
curr.push_back(i);
}
rozw(curr, root);
return;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |