//#pragma once
//#include "grader.cpp"
#include "meetings.h"
#include <bits/stdc++.h>
using namespace std;
int n,br,root,cen,used[2005],dp[2005],ind1,ind2,added[2005];
vector<int>v[2005];
void push_between(int a,int b,int st)
{
v[st].push_back(a);
v[st].push_back(b);
for(int i=0;i<v[a].size();i++)
{
if(v[a][i]==b)
{
v[a][i]=st;
break;
}
}
for(int i=0;i<v[b].size();i++)
{
if(v[b][i]==a)
{
v[b][i]=st;
break;
}
}
}
void make_dp(int beg)
{
int w;
dp[beg]=1;
used[beg]=5;
for(int i=0;i<v[beg].size();i++)
{
w=v[beg][i];
if(!used[w])
{
make_dp(w);
dp[beg]+=dp[w];
}
}
}
void find_centroid(int beg,int par,int num)
{
int w;
for(int i=0;i<v[beg].size();i++)
{
w=v[beg][i];
if(used[w]==1||w==par)continue;
if(dp[w]>=(num+1)/2)
{
find_centroid(w,beg,num);
return;
}
}
cen=beg;
}
void clea(int beg,int par)
{
int w;
dp[beg]=0;
used[beg]=0;
for(int i=0;i<v[beg].size();i++)
{
w=v[beg][i];
if(used[w]!=5||w==par)continue;
clea(w,beg);
}
}
void make_sz()
{
clea(root,0);
used[cen]=5;
int ma1=0,ma2=0,w;
ind1=-1;
ind2=-1;
for(int i=0;i<v[cen].size();i++)
{
w=v[cen][i];
if(used[w]==1)continue;
make_dp(w);
if(ma1<dp[w])
{
ma2=ma1;
ind2=ind1;
ma1=dp[w];
ind1=w;
}
else if(ma2<dp[w])
{
ma2=dp[w];
ind2=w;
}
}
used[cen]=0;
}
void mix(int ind,int st)
{
int q=Query(min(cen,ind),max(cen,ind),st);
if(q==ind)
{
v[ind].push_back(st);
v[st].push_back(ind);
br++;
}
else if(q==cen)
{
v[cen].push_back(st);
v[st].push_back(cen);
br++;
}
else if(q==st)
{
push_between(ind,cen,st);
br++;
}
else
{
push_between(ind,cen,q);
added[q]=1;
v[q].push_back(st);
v[st].push_back(q);
br+=2;
}
}
void add(int st)
{
//if(st>5)return;
root=0;
cen=0;
memset(dp,0,sizeof(dp));
memset(used,0,sizeof(used));
int num=0,flag=0;
/*cout<<st<<endl;
for(int i=0;i<n;i++)
{
cout<<i<<" : ";
for(int j=0;j<v[i].size();j++)
{
cout<<v[i][j]<<" ";
}
cout<<endl;
}*/
while(true)
{
make_dp(root);
num=dp[root];
find_centroid(root,root,num);
make_sz();
//cout<<ind1<<" "<<ind2<<" "<<cen<<" "<<num<<" "<<root<<endl;
if(ind1==-1)
{
v[cen].push_back(st);
v[st].push_back(cen);
br++;
break;
}
if(ind2==-1)
{
mix(ind1,st);
break;
}
if(num==3)
{
int q=Query(min(cen,ind2),max(cen,ind2),st);
if(q==ind2)
{
v[ind2].push_back(st);
v[st].push_back(ind2);
br++;
break;
}
if(q==st)
{
push_between(ind2,cen,st);
br++;
break;
}
if(q!=cen)
{
push_between(ind2,cen,q);
v[q].push_back(st);
v[st].push_back(q);
added[q]=1;
br+=2;
break;
}
mix(ind1,st);
break;
}
int q=Query(ind1,ind2,st);
clea(cen,cen);
root=q;
if(q==cen)
{
used[ind1]=1;
used[ind2]=1;
}
else
{
used[cen]=1;
}
/*cout<<cen<<" "<<ind1<<" "<<ind2<<endl;
for(int i=0;i<n;i++)
{
cout<<used[i]<<" ";
}
cout<<endl;*/
flag++;
if(flag==20)break;
}
}
void Solve(int N)
{
n=N;
br=1;
for(int i=1;i<n;i++)
{
if(!added[i])add(i);
}
for(int i=0;i<n;i++)
{
//cout<<i<<" : ";
for(int j=0;j<v[i].size();j++)
{
//cout<<v[i][j]<<" ";
if(v[i][j]>i)Bridge(i,v[i][j]);
}
//cout<<endl;
}
}
# | 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... |