Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
38228 | LYLAKIOIAKIOI | 【BJ】T1 | C++ | 运行超时 | 0 | 1000 MS | 17848 KB | 1578 | 2025-07-05 19:55:11 |
#include<bits/stdc++.h> #define ull unsigned long long using namespace std; const int N=2e5+10,mod=1e9+9; vector<int> E[N]; int f[N],g[N],h[N],par[N],rng[N],siz[N],du[N]; int n; mt19937_64 rd(9517); int qp(int a,int b){ int x=1; while(b){ if(b&1) x=1ll*x*a%mod; a=1ll*a*a%mod;b>>=1; }return x; } unsigned int mask=rd(); int TR(unsigned int x) { x ^= mask; x ^= x << 13; x ^= x >> 7; x ^= x << 17; x ^= mask; return x; } int SF=rd()%mod; ull F(int x,int sz){ return 7ull*x*x+2ull*(-x)+1ull*(1ull*TR(sz)+qp(131,TR(sz))+rng[sz]); } void dfs(int u,int fa){ siz[u]=1;f[u]=1;par[u]=fa; for(auto v:E[u]){ if(v==fa) continue; dfs(v,u); siz[u]+=siz[v]; f[u]=f[u]+F(f[v],siz[v]); }f[u]=f[u]+SF; }//get tree hash void dfs2(int u,int fa){ if(u!=1) h[u]=f[u]+F(g[u],n-siz[u]); else h[u]=f[u]; for(auto v:E[u]){ if(v==fa) continue; g[v]=h[u]-F(f[v],siz[v]); dfs2(v,u); }h[u]=h[u]+SF; } int main(){ cin>>n; for(int i=1;i<=n;i++) rng[i]=rd()%mod; for(int i=1;i<n;i++){ int u,v;cin>>u>>v; E[u].push_back(v); E[v].push_back(u); du[u]++;du[v]++; }dfs(1,0);dfs2(1,0); map<int,int> mp1; map<pair<int,int>,int> mp2; for(int i=1;i<=n;i++){ if(du[i]<4) mp1[h[i]]=1; if(!par[i]) continue; mp2[make_pair(f[i],g[i])]=1; mp2[make_pair(g[i],f[i])]=1; }cout<<mp1.size()<<' '<<mp1.size()+mp2.size()<<endl; return 0; }