#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);
//cerr << a << " " << b << " ans\n";
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; }
// cerr << root << " r\n";
// for(auto u : curr){
// cerr << u << " ";
// }
// cerr << " wierzch\n";
int los = curr[rand() % curr.size()];
//cerr << los << " los\n";
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);
}
// for(auto u : nasciezce){
// cerr << u << " ";
// }
// cerr << " niepos\n";
if(nasciezce.size() > 0){
vector<vector<int>> podd;
vector<int> sor = posortuj(los, nasciezce, root);
// for(auto u : sor){
// cerr << u << " ";
// }
// cerr << " pos\n";
vector<int> v1;
vector<int> v2;
odpowiedz(los, sor[0]);
for(int i = 0; i < sor.size()-1; ++i){
odpowiedz(sor[i], sor[i+1]);
}
odpowiedz(sor.back(), root);
//cerr << "wej\n";
map<int,int> ind;
for(int i = 0; i < sor.size(); ++i){
ind[sor[i]] = i;
}
//cerr << "pon\n";
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]);
//cerr << i << " " << odpowiedzi[i] << " w\n";
}
if(v1.size() > 0) rozw(v1, los);
if(v2.size() > 0) rozw(v2, root);
for(int i = 0; i < sor.size(); ++i){
if(podd[i].size() == 0) continue;
rozw(podd[i], sor[i]);
}
return;
}
else{
odpowiedz(los, root);
vector<int> v1;
vector<int> v2;
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]);
}
if(v1.size() > 0) rozw(v1, los);
if(v2.size() > 0) rozw(v2, root);
}
}
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... |