题解:CF2063E Triangle Tree
赛时做完 C 后 5 min 切 E,全球 4 杀,然后因为用的是临时邮箱注册的小号,号被封了,我上早八。
对于一对
剩下就是求
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e5+5;
int T;
int n,ans;
vector<int> g[N];
int siz[N],dep[N];
void dfs(int x,int fa){
dep[x]=dep[fa]+1,siz[x]=1;
int sum=1,tot=0;
for(int y:g[x]){
if(y==fa) continue;
dfs(y,x);
siz[x]+=siz[y],tot+=siz[y]*sum,sum+=siz[y];
}
ans-=2*dep[x]*tot;
}
void solve(){
cin>>n;
for(int i=1,x,y;i<n;i++){
cin>>x>>y;
g[x].push_back(y),g[y].push_back(x);
}
ans=-n*(n-1)/2;
dfs(1,0);
sort(dep+1,dep+n+1);
for(int i=1;i<=n;i++){
ans+=2*dep[i]*(n-i)+(dep[i]-1);
g[i].clear();
}
cout<<ans<<endl;
}
signed main(){
cin>>T;
while(T--){
solve();
}
return 0;
}