D题求大佬指点一下啊啊啊 只过了20% 求求~
D题 求大佬指点一下啊啊啊 只过了20% 求求~
#include<iostream>
#include<cstring>
using namespace std;
const int N = 1e6 + 10;
int n;
int h[N], ne[N], e[N], idx, w[N];
int f[N][2];
void add_edge(int a, int b, int c){
idx ++;
e[idx] = b;
ne[idx] = h[a];
h[a] = idx;
w[idx] = c;
if(c == 1) f[a][0] ++;
if(c == 2) f[a][1] ++;
}
int main(){
memset(h, -1, sizeof(h));
cin >> n;
for(int i = 2; i <= n; i ++){
int a, b;
scanf("%d%d", &a, &b);
add_edge(a, i, b);
add_edge(i, a, b);
}
for(int i = 1; i <= n; i ++){
for(int j = h[i]; j != -1; j = ne[j]){
if(w[j] == 1){
int t = e[j];
f[i][1] += f[t][0] - 1;
}
}
}
for(int i = 1; i <= n; i ++) printf("%d\n", f[i][0] + f[i][1] + 1);
return 0;
}

