RE求助
查看原帖
RE求助
127925
Kio_楼主2021/11/11 20:33

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;

2021/11/11 20:33
加载中...