高中3523. 【NOIP2013模拟11.7A组】JIH的玩偶

来源:互联网 发布:linux ntp 开机启动 编辑:程序博客网 时间:2024/05/14 18:29

很久没写题解了。

Description
JIH的玩具厂设立以来,发展了一张销售关系网。这张网以玩具厂为总代理(根),构成一颗树。每个节点都代表一个客户,且每个节点都有重要度ai。JIH想将这些客户划成若干类别,当然同一类的客户重要度相差太大总是不妥。所以JIH决定先进行市场调研。JIH会选择两个客户X,从X向根走一共k个节点进行调查。调查的结果是这条路径上重要程度相差最大的两个客户的差值是多少。因为特殊需要,要求重要度大的客户必须在重要度小的客户后面(顺序为X到根,若序列为递减,则输出0,详情见样例)。

Input
第一行一个整数N 表示N个客户
第二行N个整数Ai 表示N个客户的重要程度(工厂是1)
第三行开始 共N-1行 每行2个整数 x,y 表示x的父亲是y
接着一行一个正整数Q,表示Q次调研
接着Q行,每行两个整数X,K。含义见题目表述。

Output
Q行,每行一个正整数,含义见题目描述。

Sample Input
6
5 6 1 7 5 2
2 1
3 1
4 2
5 2
6 3
3
4 3
6 2
6 3

Sample Output
0
0
4

Data Constraint
30% 的数据中N,Q<=10000
100%的数据中N,Q<=200000 Ai<=1000000

30%

暴力,根据每个询问来计算答案(当然我只有10分233)

100%

考虑用倍增的思想。
(什么是倍增?自己百度)

设fa[x,j]表从节点x开始,向根移动2^j后的位置。
fmax[x,j]表从节点x开始向上2^j个节点间的最大值(包括第x个)
fmin[x,j]同上,不过是最小值
fans[x,j]表从节点x开始向上2^个节点间的答案(最大-最小,最大在最小前)

可以根据二分的思想来计算上面四个数组。
这里写图片描述

Fa数组

每一个节点的fa[x,0]都是它的父节点(0次祖先)
然后按照搜索的顺序,在一个节点之前的节点的fa都被算出来了。
那么节点x的fa[x,j]=fa[fa[x,j-1],j-1]。
就是它j-1级祖先的j-1级祖先,既是它的j级祖先。

如图,比如说我要求f[x,2] (f[x,0~1]为已知)
这里写图片描述
那么x的2^1次祖先是y,那y的2^1次祖先就是x的2^2次祖先。

Fmax/Fmin数组

比如说,一个节点已知fmax[x,0~1],求fmax[x,2]

我们可以利用求出的fa数组,把x向上分成(2^1)*2段,两段的最大/小值就是连起来一大段的答案。
这里写图片描述

Fans数组

同样分成两段来计算。

两种可能:
①最大和最小在同一段。
②最大和最小不在同一段。


这里写图片描述
像上面一样,分成两段求最大值。


这里写图片描述
用上面一段的最大值减下面一段的最小值。

关于计算答案

把它按照二进制分成若干段,有两种可能。
①总最大最小在同一段。
②不在同一段。


这里写图片描述
一边向上跳,一边统计fans数组。


这里写图片描述
类似上面,从下往上找时维护最小值,用当前这一段的最大值去减去之前的最小值。

阅读全文
1 0
原创粉丝点击