3523. 【NOIP2013模拟11.7A组】JIH的玩偶(tree)

xiaoxiao2021-02-28  82

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<=1000 100%的数据中N,Q<=200000 Ai<=1000000

分析:这题由于数据太大了,于是我们使用rmq算法求出在第i个点走2^j步遇到的点,然后再设多三个数组,一个是最小值,一个是最大值,还有一个是求答案的。

最大和最小的方程:f[i][j] = max(f[i][j],f[f[i][j-1]][j-1]); 答案求法:g[i][j] = max(g[i][j-1],g[f[i][j-1]][j-1],max_[f[i][j-1]][j-1] - min_[i][j-1]);

最后递推: ans = max(ans,gu[x][j]); ans = max(ans,gb[x][j]-last); last = min(last,gs[x][j]); x = f[x][j];

转载请注明原文地址: https://www.6miu.com/read-79100.html

最新回复(0)