第一个答案就是错的
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
#define int long long
int n,node,stamp,root[N],dfn[N],depth[N],top[N],rnk[N],siz[N],h[N],f[N],dp[N];
vector<int>g[N];
struct segtree{
int l,r,num;
segtree(){
l=r=num=0;
}
}t[N*25];
void clone(int &u){
t[++node]=t[u],u=node;
}
void build(int &u,int l,int r){
clone(u);
if(l==r){
return;
}
int mid=(l+r)/2;
build(t[u].l,l,mid),build(t[u].r,mid+1,r);
}
void pushup(int u){
t[u].num=t[t[u].l].num+t[t[u].r].num;
}
int update(int u,int l,int r,int val){
clone(u);
if(l==r){
t[u].num++;
return u;
}
int mid=(l+r)/2;
if(val<=mid){
t[u].l=update(t[u].l,l,mid,val);
}
else{
t[u].r=update(t[u].r,mid+1,r,val);
}
pushup(u);
return u;
}
int query(int u1,int u2,int l,int r,int val){//>val的个数
if(l==r){
return t[u2].num-t[u1].num;
}
int mid=(l+r)/2;
if(val>mid){
return query(t[u1].r,t[u2].r,mid+1,r,val);
}
return query(t[u1].l,t[u2].l,l,mid,val)+t[t[u2].r].num-t[t[u1].r].num;
}
void dfs(int u,int last){
siz[u]=1,depth[u]=depth[last]+1,f[u]=last;
for(int v:g[u]){
if(v!=last){
dfs(v,u),siz[v]+=siz[u];
if(siz[h[u]]<siz[v]){
h[u]=v;
}
}
}
}
void dfs(int u,int last,int Top){
dfn[u]=++stamp,rnk[stamp]=u,top[u]=Top;
if(h[u]){
dfs(h[u],u,Top);
}
for(int v:g[u]){
if(v!=h[u]&&v!=last){
dfs(v,u,v);
}
}
}
int query(int l,int r,int num){
int ret=0;
while(top[l]!=top[r]){
if(depth[top[l]]<depth[top[r]]){
swap(l,r);
}
ret+=query(root[dfn[top[l]]-1],root[dfn[l]],1,n,num),l=f[top[l]];
}
if(depth[l]<depth[r]){
swap(l,r);
}
ret+=query(root[dfn[r]-1],root[dfn[l]],1,n,num);
return ret;
}
signed main(){
cin>>n;
for(int i=1,u,v;i<n;i++){
cin>>u>>v,g[u].push_back(v),g[v].push_back(u);
}
build(root[0],1,n),dfs(1,1),dfs(1,1,1);
for(int i=1;i<=n;i++){
root[dfn[rnk[i]]]=update(root[dfn[rnk[i]]-1],1,n,rnk[i]);
}
for(int i=1;i<=n;i++){//1~i的路径上 有多少比他大的
dp[1]+=query(1,i,i);
}
cout<<dp[1]<<" ";
}