RT,第10个点RE
#include<cstdio>
using namespace std;
typedef long long ll;
const int N = 2e5+10;
inline bool isd(int c){return '0'<=c&&c<='9';}
int read(){
int num,c,f=1;
for(;!isd(c=getchar());f=c);
for(num=c^48;isd(c=getchar());(num*=10)+=c^48);
return f^45?num:-num;
}
struct edge{
int u,v,nxt;
edge(int u=0,int v=0,int nxt=0):u(u),v(v),nxt(nxt){}
}e[N];int head[N],cnt;
inline void addline(int u,int v){
e[++cnt] = edge(u,v,head[u]),head[u] = cnt;
}
int n,fa[N];
ll size[N],f[N],d[N],count[2];
ll ans;
void dfs(int x,int fax){
size[x] = 1;
for(int i=head[x];i;i=e[i].nxt){
int y = e[i].v;
if(y==fax) continue;
fa[y] = x, d[y] = d[x] + 1, count[d[y]&1]++;
dfs(y,x);
size[x] += size[y];
}
}
void dfs2(int x){
for(int i=head[x];i;i=e[i].nxt){
int y = e[i].v;
if(y==fa[x]) continue;
f[y] = f[x]+n-2*size[y];
dfs2(y);
}
}
int main(){
n=read();
for(int i=1;i<n;i++){
int u=read(),v=read();
addline(u,v), addline(v,u);
}
d[1] = 0, dfs(1,0);
for(int i=1;i<=n;i++) f[1] += d[i];
dfs2(1);
for(int i=1;i<=n;i++) ans += f[i];
printf("%lld",(ans/2+(count[0]+1)*count[1])/2);//点1应计入偶数count中
return 0;
}
求dalao帮调;w;