比赛 2025.6.2 评测结果 WWWWWWWWWW
题目名称 0-1-Tree 最终得分 0
用户昵称 123 运行时间 0.529 s
代码语言 C++ 内存使用 12.33 MiB
提交时间 2025-06-02 12:11:07
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=400010; 
int m,x,y,z,idx[N],nxt[N],head[N],val[N],tot=0;
long long ret=0,dp[N][5],dp1[N][5];
void add(int x,int y,int z)
{
	idx[++tot]=y;
	val[tot]=z;
	nxt[tot]=head[x];
	head[x]=tot;
}
void dfs(int now,int fa)
{
	long long cnt=0,cnt1=0;
	for (int i=head[now];i;i=nxt[i])
	{
		int y=idx[i];
		if (y==fa)
		{
			continue;
		}
		dfs(y,now);
		if (val[i]==0)
		{
			ret+=dp[y][0],ret+=dp1[y][0],ret+=dp1[y][1]; 
			ret+=2; 
			dp[now][0]+=dp[y][0]+1;
			dp1[now][0]+=dp1[y][1]+dp1[y][0]+1,dp1[now][1]+=dp1[y][1];
			cnt+=dp1[y][0]+1,cnt1+=dp1[y][1];
		}
		else
		{
			ret+=dp[y][0],ret+=dp[y][1],ret+=dp1[y][1];
			ret+=2;
			dp[now][1]+=dp[y][0]+1+dp[y][1];
			dp1[now][1]+=dp1[y][1]+1;
			cnt1+=dp1[y][1]+1;
		} 
	}
	for (int i=head[now];i;i=nxt[i])
	{
		int y=idx[i];
		if (y==fa)
		{
			continue;
		}
		if (val[i]==0)
		{
			ret+=(dp[y][0]+1)*(cnt+cnt1-dp1[y][0]-dp1[y][1]-1);
//			cout<<"qwq "<<y<<" "<<(dp[y][0]+1)<<" "<<(cnt+cnt1-dp1[y][0]-dp1[y][1])<<endl; 
		}
		else
		{
			ret+=(dp[y][0]+dp[y][1]+1)*(cnt1-dp1[y][1]-1);
//			cout<<"qwq "<<y<<" "<<(dp[y][0]+dp[y][1]+1)<<" "<<(cnt1-dp1[y][1])<<endl;
		} 
	}
//	printf("%d %d %d %d %d %d %d %lld\n",now,dp[now][0],dp[now][1],dp1[now][0],dp1[now][1],cnt,cnt1,ret); 
}
int main() {
	freopen("0-1-Tree.in","r",stdin);
	freopen("0-1-Tree.out","w",stdout); 
	cin>>m;
	m--; 
	while (m--)
	{
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z),add(y,x,z);
	}
	dfs(1,0);
	cout<<ret; 
}