题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5678
题目大意:
给出一颗根为1的树,有n个点,每个点都有一个value值。然后给出n-1条边,表示有两个点之间是相连的,最后形成一颗树。然后给出m个询问,每次询问节点x以下所有节点形成的序列的中位数。
范围:
n<=10^5,m<=10^6,1<=val<=10^9。
思路:
主席树模板题。
对于节点x以下的节点形成的序列求中位数,我们很容易想到利用主席树求任意区间上的第k大来获得中位数。所以重点就是如何将节点x以下的节点构成一个序列放到区间里面。其实也很简单,因为他要的是所有子树,所以只需要一个dfs序处理出来就可以了。
注意要先预处理出n以内的所有节点的中位数,否则会超时。
代码:
#include
#include
#include
#include
#include
#include