传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5807
题意:
给出一棵树,根节点为1。每条边有一个距离,树上有m个点为红色的点,其余为黑色,每个点的权值为到其最近红色祖先的距离。有q次询问,每次给出一个点集,问在树上涂红一个点后,点集中所有点的最大值的最小值是多少。
思路:
预处理每个点到根的距离cost、到最近红色祖先的距离cost_t和ST表。
对于每次询问,按cost_t从大到小排序,在0~cost_t[0]范围内二分答案,对所有大于答案的点求它们的公共祖先(利用ST表可以O(1)求两点的公共祖先),将其涂红,之后计算每个大于答案的点的新权值是否小于答案。
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<utility>
#include<algorithm>
#include<utility>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#include<cmath>
#include<map&g