이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define pii pair<int, int>
using namespace std;
const int N=5e5+5;
int n, tmr=0;
vector<int> adj[N], lvlst[N];
vector< pii > ans;
int lv[N], p[N];
struct lvsrt
{
bool operator()(const int &a, const int &b)
{
return lv[a]>lv[b];
}
};
void dfs(int u)
{
for(auto &v: adj[u])
{
if(v!=p[u])
{
p[v]=u;
dfs(v);
lv[u]+=lv[v];
}
}
if(adj[u].size()==1 && u!=1)
{
tmr++;
lv[u]=1;
}
}
int findg(int u)
{
//cout << tmr << " finding g: " << u << endl;
for(auto &v: adj[u])
{
if(lv[v]>tmr/2 && p[u]!=v)
{
return findg(v);
}
}
return u;
}
void findlvs(int u, int subt)
{
for(auto &v: adj[u])
{
if(v!=p[u])
{
p[v]=u;
findlvs(v, subt);
}
}
if(adj[u].size()==1)
{
lvlst[subt].pb(u);
}
}
int main()
{
ios_base::sync_with_stdio(false); cin.tie(0);
cin >> n;
for(int i = 1; i < n; i++)
{
int u, v;
cin >> u >> v;
adj[u].pb(v);
adj[v].pb(u);
}
p[1]=1;
dfs(1);
if(adj[1].size()==1) tmr++;
int g=findg(1);
// cout << g;
sort(adj[g].begin(), adj[g].end(), lvsrt());
memset(p, 0, n+1);
int numsubt=adj[g].size();
for(int i = 0; i < numsubt; i++)
{
p[adj[g][i]]=g;
findlvs(adj[g][i], i);
}
int itr=0;
for(int i = 0; i < tmr/2; i++) ans.pb(mp(0, 0));
bool chk=false;
for(int i = 0; i < numsubt; i++)
{
for(auto &v: lvlst[i])
{
if(!chk && itr==tmr/2)
{
itr=0;
chk=true;
}
if(!chk) ans[itr].first=v;
else ans[itr].second=v;
if(chk && itr==tmr/2) break;
itr++;
}
}
if(tmr%2)
{
ans.pb(mp(g, lvlst[numsubt-1].back()));
}
cout << ans.size() << "\n";
for(auto &v: ans)
{
cout << v.first << " " << v.second << "\n";
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |