题意:
一
棵
n
个
点
的
树
,
最
开
始
点
权
为
0
一棵n个点的树,最开始点权为0
一棵n个点的树,最开始点权为0
每
次
选
一
个
点
并
且
把
和
他
距
离
为
1
的
点
的
权
值
加
一
每次选一个点并且把和他距离为1的点的权值加一
每次选一个点并且把和他距离为1的点的权值加一
统
计
该
次
加
的
这
些
点
的
最
终
权
值
和
,
乘
上
次
数
的
总
和
统计该次加的这些点的最终权值和,乘上次数的总和
统计该次加的这些点的最终权值和,乘上次数的总和
m
o
d
19260817
mod19260817
mod19260817
题解:
n
<
=
1
e
5
,
m
<
=
1
e
6
n <=1e5,m<=1e6
n<=1e5,m<=1e6
数
据
较
大
,
不
能
每
次
暴
力
统
计
数据较大,不能每次暴力统计
数据较大,不能每次暴力统计
所
以
要
用
数
组
维
护
,
分
开
处
理
所以要用数组维护,分开处理
所以要用数组维护,分开处理
考
虑
对
于
每
次
选
点
的
贡
献
来
源
考虑对于每次选点的贡献来源
考虑对于每次选点的贡献来源
肯
定
是
父
结
点
和
子
结
点
会
给
出
相
应
贡
献
肯定是父结点和子结点会给出相应贡献
肯定是父结点和子结点会给出相应贡献
子
结
点
和
自
身
给
的
贡
献
就
用
s
o
n
[
x
]
维
护
子结点和自身给的贡献就用son[x]维护
子结点和自身给的贡献就用son[x]维护
每
次
s
o
n
[
x
]
加
上
x
点
的
度
数
,
就
是
当
次
对
x
的
贡
献
每次son[x]加上x点的度数,就是当次对x的贡献
每次son[x]加上x点的度数,就是当次对x的贡献
s
o
n
[
f
a
[
x
]
]
加
上
2
,
该
次
操
作
对
于
父
结
点
的
贡
献
是
当
前
结
点
和
父
结
点
两
个
son[fa[x]]加上2,该次操作对于父结点的贡献是当前结点和父结点两个
son[fa[x]]加上2,该次操作对于父结点的贡献是当前结点和父结点两个
父
亲
的
父
亲
结
点
的
s
o
n
数
组
加
1
,
该
次
操
作
对
父
亲
的
父
亲
结
点
的
贡
献
父亲的父亲结点的son数组加1,该次操作对父亲的父亲结点的贡献
父亲的父亲结点的son数组加1,该次操作对父亲的父亲结点的贡献
就
是
该
次
操
作
父
亲
结
点
权
值
加
一
,
会
对
父
亲
的
父
亲
结
点
产
生
贡
献
就是该次操作父亲结点权值加一,会对父亲的父亲结点产生贡献
就是该次操作父亲结点权值加一,会对父亲的父亲结点产生贡献
这
样
就
考
虑
完
了
一
个
结
点
来
自
自
身
和
子
结
点
的
贡
献
了
这样就考虑完了一个结点来自自身和子结点的贡献了
这样就考虑完了一个结点来自自身和子结点的贡献了
然
后
考
虑
父
节
点
对
选
择
点
的
贡
献
然后考虑父节点对选择点的贡献
然后考虑父节点对选择点的贡献
用
f
a
t
h
e
r
[
x
]
来
维
护
用father[x]来维护
用father[x]来维护
对
于
每
次
对
x
操
作
,
x
和
f
a
[
x
]
都
会
增
加
权
值
1
并
对
他
们
的
子
结
点
产
生
贡
献
对于每次对x操作,x和fa[x]都会增加权值1并对他们的子结点产生贡献
对于每次对x操作,x和fa[x]都会增加权值1并对他们的子结点产生贡献
所
以
f
a
[
x
]
和
x
的
f
a
t
h
e
r
数
组
都
要
加
1
所以fa[x]和x的father数组都要加1
所以fa[x]和x的father数组都要加1
但
发
现
这
样
统
计
的
父
结
点
的
贡
献
是
不
够
的
但发现这样统计的父结点的贡献是不够的
但发现这样统计的父结点的贡献是不够的
因
为
还
有
父
结
点
自
身
操
作
会
增
加
子
结
点
的
权
值
因为还有父结点自身操作会增加子结点的权值
因为还有父结点自身操作会增加子结点的权值
还
有
父
亲
的
父
亲
结
点
操
作
增
加
父
亲
结
点
的
值
没
有
统
计
上
还有父亲的父亲结点操作增加父亲结点的值没有统计上
还有父亲的父亲结点操作增加父亲结点的值没有统计上
所
以
用
c
n
t
[
x
]
维
护
x
结
点
的
操
作
数
所以用cnt[x]维护x结点的操作数
所以用cnt[x]维护x结点的操作数
结
果
就
是
结果就是
结果就是
f
a
t
h
e
r
[
f
a
[
x
]
]
+
s
o
n
[
x
]
+
c
n
t
[
f
a
[
x
]
]
+
c
n
t
[
f
a
[
f
a
[
x
]
]
]
father[fa[x]]+son[x]+cnt[fa[x]]+cnt[fa[fa[x]]]
father[fa[x]]+son[x]+cnt[fa[x]]+cnt[fa[fa[x]]]
AC代码
/*
Author : zzugzx
Lang : C++
Blog : blog.csdn.net/qq_43756519
*/
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(), (x).end()
#define endl '\n'
#define SZ(x) (int)x.size()
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod = 19260817;
//const int mod = 998244353;
const double eps = 1e-10;
const double pi = acos(-1.0);
const int maxn = 1e6+10;
const ll inf = 0x3f3f3f3f;
const int dir[][2]={{0, 1}, {1, 0}, {0, -1}, {-1, 0}, {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
ll fa[maxn], d[maxn], son[maxn], father[maxn], cnt[maxn];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
int n, m;
cin >> n >> m;
for (int i = 2; i <= n; i++){
int x;
cin >> x;
fa[i] = x;
d[x]++; d[i]++;
}
ll ans = 0;
for (int i = 1, x; i <= m; i++) {
cin >> x;
++cnt[x];
son[x] = (son[x] + d[x]) % mod;
son[fa[x]] = (son[fa[x]] + 2) % mod;
son[fa[fa[x]]] = (son[fa[fa[x]]] + 1) % mod;
father[x] = (father[x] + 1) % mod;
father[fa[x]] = (father[fa[x]] + 1) % mod;
ans = (ans + i * (son[x] + father[fa[x]] + cnt[fa[x]] + cnt[fa[fa[x]]])) % mod;
}
cout << ans;
return 0;
}