求大神看看,怎么改都是60
include
using namespace std;
const int maxn = 1e5 + 5;
struct note
{
int to, nex;
} a[maxn * 2];
int fir[maxn], val[maxn], len, num1[maxn], num2[maxn], sum[maxn];
int n, s, ans2, ans1;
void add(int t1,int t2)
{
a[len]=note{t2,fir[t1]};
fir[t1]=len++;
}
void dfs(int i,int fa) //sum为节点所有子孙节点的总和,num1是子孙和为s的个数
{
sum[i]=val[i];
for (int q=fir[i];q+1;q=a[q].nex)
{
int v=a[q].to;
if (v==fa) continue;
dfs(v,i);
sum[i]+=sum[v];
num1[i]+=num1[v];
}
if (sum[i]==s)
{
num1[i]++;
}
}
void ddfs(int i,int fa) //num2是祖先节点和为s的个数
{
if (sum[i]==s) num2[i]++;
for (int q=fir[i];q+1;q=a[q].nex)
{
int v=a[q].to;
if (v==fa) continue;
num2[v]+=num2[i];
ddfs(v,i);
}
}
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
memset(fir, -1, sizeof fir);
memset(val, 0, sizeof val);
len = 0;
memset(num1, 0, sizeof num1);
memset(num2, 0, sizeof num2);
memset(sum, 0, sizeof sum);
s=0;
scanf("%d", &n);
int t1, t2;
for (int q = 1; q <= n; q++)
{
scanf("%d%d", &t1, &t2);
val[q] = t1;
s+=t1;
add(t2, q);
add(q, t2);
}
if (s%3!=0)
printf("0\n");
else
{
s/=3;
ans1=0,ans2=0;
dfs(0,0);
ddfs(0,0);
for (int q=1;q<=n;q++)
{
if (sum[q]==s) ans1+=num1[0]-num1[q]-num2[q]+1;
if (sum[q]==2*s){
ans2+=num1[q];
}
}
printf("%d\n",ans1/2+ans2);
}
}
return 0;
}
噗,父亲节点编号为0的节点为这棵树的根节点...