Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
38235 LYLAKIOIAKIOI 【BJ】T1 C++ 通过 100 287 MS 58888 KB 2053 2025-07-07 14:27:18

Tests(31/31):


#include<bits/stdc++.h> #define pii pair<int,int> #define fi first #define se second #define mk make_pair using namespace std; const int N=2e5+10,base=131,mod1=1e9+9,mod2=1e9+7; vector<int> E[N]; int par[N],rng[N],du[N],siz[N]; pii f[N],g[N],h[N]; int n; mt19937_64 rd(9517); int qp(int a,int b,const int mod){ int x=1; while(b){ if(b&1) x=1ll*x*a%mod; a=1ll*a*a%mod;b>>=1; }return x; } pii add(pii a,int b){ a.fi=(a.fi+b)%mod1; a.se=(a.se+b)%mod2; return a; } pii Hs(multiset<pii> h){ int v1=0,v2=0,cnt=0; multiset<int> h1,h2; for(auto ed:h){ h1.insert(ed.fi); h2.insert(ed.se); } for(auto ed:h1){ v1=(v1+1ll*qp(base,cnt,mod1)*ed+1ll*ed*ed)%mod1; cnt++; }cnt=0; for(auto ed:h2){ v2=(v2+1ll*qp(base,cnt,mod2)*ed+1ll*ed*ed)%mod2; cnt++; } return mk(v1,v2); } multiset<pii> H[N]; void dfs(int u,int fa){ siz[u]=1;par[u]=fa; for(auto v:E[u]){ if(v==fa) continue; dfs(v,u); siz[u]+=siz[v]; H[u].insert(f[v]); }f[u]=add(Hs(H[u]),rng[siz[u]]); }//get tree hash void dfs2(int u,int fa){ if(u==1){ h[u]=f[u]; }else{ H[u].insert(g[u]); h[u]=add(Hs(H[u]),rng[siz[1]]); } for(auto v:E[u]){ if(v==fa) continue; H[u].erase(H[u].find(f[v])); g[v]=add(Hs(H[u]),rng[n-siz[v]]); H[u].insert(f[v]); dfs2(v,u); } } int main(){ cin>>n; for(int i=1;i<=n;i++) rng[i]=rd()%((int)1e9); 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<pii,int> mp1; map<pair<pii,pii>,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; }


测评信息: