提交时间:2025-06-27 12:38:39
运行 ID: 38183
#include<bits/stdc++.h> using namespace std; #define int long long #define pii pair<int,int> #define fr first #define sc second #define mk make_pair #define pb push_back #define inx(u) int I=h[(u)],v=edge[I].v;I;I=edge[I].nx,v=edge[I].v int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;} const int MAXN=300010,base=2333,Mod=1011451423; struct Edge{int v,nx;}edge[MAXN<<1];int h[MAXN],CNT;void add_side(int u,int v){edge[++CNT]={v,h[u]};h[u]=CNT;edge[++CNT]={u,h[v]};h[v]=CNT;} int n,m,d[MAXN]; int MN,id1,id2; int init(int u,int lst){ int res=1+(4-d[u]),mx=0; for(inx(u))if(v!=lst){ int tmp=init(v,u); res+=tmp; mx=max(mx,tmp); } mx=max(mx,m-res); if(mx==MN)id2=u; if(mx<MN)MN=mx,id1=u,id2=0; return res; } int f[MAXN],g[MAXN],g2[MAXN]; void dfs(int u,int lst){ f[u]=43; vector<pii>G; for(inx(u))if(v!=lst)dfs(v,u),G.pb(mk(f[v],v)); sort(G.begin(),G.end()); int tmp=1; for(auto o:G)f[u]=(f[u]*base+o.fr*tmp+o.fr*o.fr)%Mod,tmp=tmp*base%Mod; } void dfs2(int u,int lst){ vector<pii>G; for(inx(u))if(v!=lst)G.pb(mk(f[v],v)); sort(G.begin(),G.end()); g[u]=(lst?2:0)+(d[u]!=4); g2[u]=d[u]!=4; int tmp=-1; for(auto o:G)if(o.fr!=tmp)dfs2(o.sc,u),g[u]+=g[o.sc],g2[u]+=g2[o.sc],tmp=o.fr; // cout<<u<<":"<<g[u]<<" "<<g2[u]<<" "<<d[u]<<endl; } void slv(){ m=n=read(); for(int i=1;i<n;i++){ int u=read(),v=read(); add_side(u,v); d[u]++,d[v]++; } for(int i=1;i<=n;i++)m+=4-d[i]; MN=m; init(1,1); // cout<<id1<<" "<<id2<<endl; if(id2){ dfs(id2,0); int tmp=f[id1]; dfs(id1,0); dfs2(id1,0); if(tmp==f[id2])printf("%lld %lld\n",g2[id2],g[id2]-1); else printf("%lld %lld\n",g2[id1],g[id1]); } else{ dfs(id1,0); dfs2(id1,0); printf("%lld %lld\n",g2[id1],g[id1]); } } signed main(){ // freopen("1.in","r",stdin);freopen("2.out","w",stdout); slv(); return 0; }