比赛 |
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;
}