A93074.「SNOI2024」字符树
NOI/NOI+/CTSC
通过率:0%
时间限制:7.00s
内存限制:256MB
题目描述
给你一个 n 个点的有根树,根为 1。每条边上有一个字符 c={0,1} 。Su 表示从根到 u 的路径上每条边的字符依次写下来组成的字符串。保证每个节点向儿子的边上的字符互不相同。
对每个点 u,有一个价值 valu 和一个限制 au。对每个点 u,如果点 v 满足 Su 是 Sv 的后缀。那么我们认为 v 是的 u 扩展点。
Alice 手里有一个字符串 S,初始令 S=Su,现在他可以删掉若干末尾的字符,使得 S 变成 S′。并将 S′ 告诉给 Bob。
Bob 获得了一个字符串 S′,他需要在 S′ 之后加入若干字符,并获得 S′′。对于某个 u 的扩展点v,满足 S′′=Sv,并且 ∣S′∣≥av,那么 Bob就获得了 valv 的收益,当然 Bob 只能进行一次这样的操作,所以他会选择符合条件的 v 里,valv 最大的那个。如果没有符合条件的 v,Bob 只能获得 0 的收益。
现在 Alice 想知道,对于删除 0∼∣S∣ 个字符,总计 ∣S∣+1 种删除方式里 Bob 能获得权值之和是多少?
对于每个 u,你都需要回答 Alice 的询问。
形式化地说:
我们需要对每个点 u 求出 ansu=0≤i≤∣Su∣∑i≥av∧Su=Sv[∣Sv∣−∣Su∣+1,∣Sv∣]∧Su[1,i]=Sv[1,i]maxvalv。
特殊的,如果对于某个 u,不存在任何 v 满足条件,那么 max=0。
其中 S[l,r] 表示字符串S的第 l 到第 r 个字符组成的字符串。特殊的,S[x+1,x] 表示空串。∣S∣ 表示字符串 S 的长度,∧ 表示且。
输入格式
多组测试数据,第一行一个整数 T 表示数据组数。
对于每组测试数据,第一行一个正整数 n,表示节点个数。
接下来 n−1 行,每行两个整数fai,ci 表示第 i 个点的父亲编号,以及边上的字符。
接下来一行 n 个正整数 val1,val2,…,valn。
接下来一行 n 个非负整数 a1,a2,…,an。
输出格式
输出一行 n 个整数 ans1,ans2,…,ansn。
输入输出样例
输入#1
1 5 1 0 1 1 2 0 2 1 1 2 3 4 5 0 1 0 1 2
输出#1
3 4 6 8 5
说明/提示
对于所有数据保证 1≤T≤5, 1≤n≤5×105, 1≤vali≤109, 1≤fai<i,ci={0,1},0≤ai≤n。
具体如下:
| 测试点编号 | n≤ | 特殊性质 |
|---|---|---|
| 1∼2 | 100 | |
| 3∼5 | 2×103 | |
| 6∼8 | 104 | |
| 9∼10 | 105 | A |
| 11∼12 | 105 | B |
| 13∼16 | 105 | |
| 17∼20 | 5×105 |
特殊性质 A:ci=0。
特殊性质 B:fai=⌊2i⌋。