http://www.elijahqi.win/2018/03/04/codeforces-342e-xenia-and-tree/
题目描述
Xenia the programmer has a tree consisting of
n
n nodes. We will consider the tree nodes indexed from 1 to
n
n . We will also consider the first node to be initially painted red, and the other nodes — to be painted blue.
The distance between two tree nodes
v
v and
u
u is the number of edges in the shortest path between
v
v and
u
u .
Xenia needs to learn how to quickly execute queries of two types:
paint a specified blue node in red;
calculate which red node is the closest to the given one and print the shortest distance to the closest red node.
Your task is to write a program which will execute the described queries.
输入输出格式
输入格式:
The first line contains two integers
n
n and
m
m
(2<=n<=10^{5},1<=m<=10^{5})
(2<=n<=105,1<=m<=105) — the number of nodes in the tree and the number of queries. Next
n-1
n−1 lines contain the tree edges, the
i
i -th line contains a pair of integers
a_{i},b_{i}
ai,bi
(1<=a_{i},b_{i}<=n,a_{i}≠b_{i})
(1<=ai,bi<=n,ai≠bi) — an edge of the tree.
Next
m
m lines contain queries. Each query is specified as a pair of integers
t_{i},v_{i}
ti,vi
(1<=t_{i}<=2,1<=v_{i}<=n)
(1<=ti<=2,1<=vi<=n) . If
t_{i}=1
ti=1 , then as a reply to the query we need to paint a blue node
v_{i}
vi in red. If
t_{i}=2
ti=2 , then we should reply to the query by printing the shortest distance from some red node to node
v_{i}
vi .
It is guaranteed that the given graph is a tree and that all queries are correct.
输出格式:
For each second type query print the reply in a single line.
输入输出样例
输入样例#1: 复制
5 4
1 2
2 3
2 4
4 5
2 1
2 5
1 2
2 5
输出样例#1: 复制
0
3
2
每sqrt(n)个就暴力做一遍 比较最小 如果到达sqrt(n)了 就全局bfs一下将这些信息更新到每个点里面 保证每次询问的都是sqrt(n)的内容 另外这里的lca我选择了rmq的离线版本 o(1)回答询问 否则复杂度可能变成n*sqrt(n)*log(n)
#include
#include
#include
#include