#include "meetings.h"
#include<bits/stdc++.h>
using namespace std;
#define query Query
#define answer Bridge
#define pb push_back
const int lim=2100;
unordered_set<int>v[lim];
vector<int>ch;
int dfs(int node,int par,int targ){
if(node==targ){
ch.clear();
ch.pb(node);
return 1;
}
for(int j:v[node]){
if(j==par)continue;
if(dfs(j,node,targ)){
ch.pb(node);
return 1;
}
}
return 0;
}
int gonna[lim];
void killall(int node,int par,int targ){
if(node==targ)return;
gonna[node]=0;
for(int j:v[node]){
if(j==par)continue;
killall(j,node,targ);
}
}
int tot;
int sz[lim],vis[lim];
int sbs(int node,int par){
sz[node]=1;
for(int j:v[node]){
if(!vis[j]||!gonna[j]||j==par)continue;
sz[node]+=sbs(j,node);
}
return sz[node];
}
int findcen(int node,int par){
for(int j:v[node]){
if(!vis[j]||!gonna[j]||j==par)continue;
if(tot<2*sz[j])return findcen(j,node);
}
return node;
}
void Solve(int n){
v[0].insert(1);
v[1].insert(0);
vis[0]=vis[1]=1;
for(int i=2;i<n;i++){
if(vis[i])continue;
for(int j=0;j<n;j++)gonna[j]=1;
while(!vis[i]){
int cnt=0,dude=0;
for(int j=0;j<n;j++){
if(vis[j]&&gonna[j]){
cnt++;
dude=j;
}
}
if(cnt==1){
vis[i]=1;
v[i].insert(dude);
v[dude].insert(i);
break;
}
vector<int>leafs;
if(cnt==2){
leafs.pb(dude);
for(int j:v[dude]){
if(vis[j]&&gonna[j])leafs.pb(j);
}
}else{
tot=sbs(dude,-1);
dude=findcen(dude,-1);
tot=-1;
for(int j:v[dude]){
if(vis[j]&&gonna[j]){
leafs.pb(findcen(j,dude));
if(leafs.size()==2)break;
}
}
}
// assert(leafs.size()==2);
int res=query(leafs[0],leafs[1],i);
if(!vis[res]){
dfs(leafs[0],-1,leafs[1]);
int l=1,r=ch.size()-2,ans=ch.size()-1;
while(l<=r){
int mid=l+r>>1;
int cur=query(ch[mid],ch.back(),res);
if(cur==res){
l=mid+1;
}else{
ans=mid;
r=mid-1;
}
}
v[ch[ans]].erase(ch[ans-1]);
v[ch[ans-1]].erase(ch[ans]);
v[ch[ans]].insert(res);
v[res].insert(ch[ans]);
v[ch[ans-1]].insert(res);
v[res].insert(ch[ans-1]);
vis[res]=1;
}
killall(leafs[0],-1,res);
killall(leafs[1],-1,res);
gonna[res]=1;
}
}
int leafcnt=0;
for(int i=0;i<n;i++){
leafcnt+=v[i].size()==1;
}
// cerr<<leafcnt<<'\n';
for(int i=0;i<n;i++){
for(int j:v[i]){
if(i<j){
answer(i,j);
}
}
}
}
# | 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... |