bnuoj 33648 Neurotic Network(树形模拟题)

时间:2023-03-08 16:04:13

http://www.bnuoj.com/bnuoj/problem_show.php?pid=33648

【题解】:结果先对MOD*2取模,才能得到结果是否是正确的奇偶问题,得到最后结果之后再对MOD取模。。。

【code】:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue> using namespace std;
#define MOD 1000000007 struct Nod
{
int parent;
long long sum;
int edge;
int son_cnt;
}node[],temp; int n;
int a[],b[],vis[]; void init()
{
int i;
for(i=;i<=n;i++)
{
node[i].parent=-;
node[i].sum=;
node[i].edge=;
node[i].son_cnt=;
}
} int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
init();
int i;
for(i=;i<n;i++)
{
scanf("%d",a+i);
}
for(i=;i<n;i++)
{
scanf("%d",b+i);
}
memset(vis,,sizeof(vis));
for(i=;i<n;i++)
{
node[i].parent=a[i];
node[i].edge=b[i];
node[a[i]].son_cnt++;
}
queue<Nod> Q;
for(i=;i<n;i++)
{
if(node[i].son_cnt==)
{
node[i].sum = ;
Q.push(node[i]);
}
} while(!Q.empty())
{
temp = Q.front();
Q.pop();
if(temp.parent==-) break;
node[temp.parent].sum+=(temp.sum*temp.edge)%(MOD*);
node[temp.parent].son_cnt--;
if(node[temp.parent].son_cnt==)
{
Q.push(node[temp.parent]);
}
}
if(node[].sum%==)
{
puts("FREAK OUT");
}
else
{
printf("%lld\n",node[].sum%MOD);
}
}
return ;
}