#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 p[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){
iota(p,p+n,0);
random_shuffle(p,p+n);
v[p[0]].insert(p[1]);
v[p[1]].insert(p[0]);
vis[p[0]]=vis[p[1]]=1;
for(int i=2;i<n;i++){
if(vis[p[i]])continue;
for(int j=0;j<n;j++)gonna[j]=1;
while(!vis[p[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[p[i]]=1;
v[p[i]].insert(dude);
v[dude].insert(p[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],p[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;
gonna[res]=1;
}
killall(leafs[0],-1,res);
killall(leafs[1],-1,res);
}
}
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);
}
}
}
}
Compilation message (stderr)
meetings.cpp: In function 'void Solve(int)':
meetings.cpp:66:17: warning: 'void std::random_shuffle(_RAIter, _RAIter) [with _RAIter = int*]' is deprecated: use 'std::shuffle' instead [-Wdeprecated-declarations]
66 | random_shuffle(p,p+n);
| ~~~~~~~~~~~~~~^~~~~~~
In file included from /usr/include/c++/13/algorithm:61,
from /usr/include/x86_64-linux-gnu/c++/13/bits/stdc++.h:51,
from meetings.cpp:2:
/usr/include/c++/13/bits/stl_algo.h:4581:5: note: declared here
4581 | random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last)
| ^~~~~~~~~~~~~~
# | 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... |