#include "meetings.h"
#include <bits/stdc++.h>
using namespace std;
pair<int,int> correct(pair<int,int> p){
if (p.first>p.second)swap(p.first,p.second);
return p;
}
set<int> graph[2002];
set<int> possible;
vector<int> siz;
void dfs(int v, int p){
possible.erase(v);
for (auto u : graph[v]){
if (u==p || !possible.count(u))continue;
dfs(u,v);
}
}
pair<int,int> find_mid(int v, int p){
siz[v]=1;
pair<int,int> cur={-1,-1};
for (auto u : graph[v]){
if (u==p || !possible.count(u))continue;
pair<int,int> tmp=find_mid(u,v);
if (tmp.first!=-1)return tmp;
if (cur.second==-1 || siz[u]>siz[cur.second])cur.second=u;
siz[v]+=siz[u];
}
if (2*siz[v]>=(int)possible.size()){
cur.first=v;
if (cur.second==-1 || (siz[cur.second]+siz[v]<(int)possible.size() && p!=-1))cur.second=p;
}
return cur;
}
mt19937 losowe(chrono::high_resolution_clock::now().time_since_epoch().count());
void Solve(int N){
set<pair<int,int>> odc;
siz.resize(N+1);
int x=losowe()%N,y=losowe()%N,z=losowe()%N;
while(y==x)y=losowe()%N;
while(z==x || z==y)z=losowe()%N;
int sr=Query(x,y,z);
if (sr!=x){
graph[sr].insert(x);
graph[x].insert(sr);
odc.insert(correct({sr,x}));
}
if (sr!=y){
graph[sr].insert(y);
graph[y].insert(sr);
odc.insert(correct({sr,y}));
}
if (sr!=z){
graph[sr].insert(z);
graph[z].insert(sr);
odc.insert(correct({sr,z}));
}
vector<int> kol(N);
for (int i = 0; i<N; i++)kol[i]=i;
shuffle(kol.begin(),kol.end(),losowe);
for (int i = 0; i<N; i++){
if (graph[kol[i]].size())continue;
possible.clear();
for (int j = 0; j<N; j++)if (graph[j].size())possible.insert(j);
while(possible.size()>1){
pair<int,int> st = find_mid(*possible.begin(),-1);
int v=st.first;
int u=st.second;
int lca=Query(v,u,kol[i]);
if (lca==v)dfs(u,v);
else if (lca==u)dfs(v,u);
else{
odc.erase(correct({v,u}));
odc.insert(correct({v,lca}));
odc.insert(correct({u,lca}));
graph[v].erase(u);
graph[u].erase(v);
graph[v].insert(lca);
graph[u].insert(lca);
graph[lca].insert(v);
graph[lca].insert(u);
if (kol[i]!=lca){
graph[kol[i]].insert(lca);
graph[lca].insert(kol[i]);
odc.insert(correct({lca,kol[i]}));
}
break;
}
}
if (graph[kol[i]].size())continue;
int v = *possible.begin();
graph[v].insert(kol[i]);
graph[kol[i]].insert(v);
odc.insert(correct({kol[i],v}));
}
for (auto e : odc)Bridge(e.first,e.second);
}
# | 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... |