P2638【SDOI2013 R1 Day1】森林
问题描述
输入格式
第一行包含一个正整数testcase,表示当前测试数据的测试点编号。保证1≤testcase≤20。
第二行包含三个整数N,M,T,分别表示节点数、初始边数、操作数。第三行包含N个非负整数表示 N个节点上的权值。
接下来 M行,每行包含两个整数x和 y,表示初始的时候,点x和点y 之间有一条无向边,
接下来 T行,每行描述一个操作,格式为“Q x y k”或者“L x y ”,其含义见题目描述部分。
输出格式
对于每一个第一类操作,输出一个非负整数表示答案。
样例输入
1
8 4 8
1 1 2 2 3 3 4 4
4 7
1 8
2 4
2 1
Q 8 7 3
Q 3 5 1
Q 10 0 0
L 5 4
L 3 2
L 0 7
Q 9 2 5
Q 6 1 6
样例输出
2
2
1
4
2
注意观察,此题只有连接操作,而没有权值修改和删除操作,因此我们先考虑如果是一棵树的情况,那么显然用主席树维护,考虑主席树求第K小的时候,是两颗树相减,那么在树上只需要将每个节点都搞一棵主席树,等于他父亲那颗树加上他的权,那么就是x对应的树+y对应的树-LCA对应的树,然后加上LCA的单独点权即可。
那么考虑森林,因为只有连接操作,那么考虑暴力维护LCA,发现每次连接两颗树的时候,需要选一棵树来重新构建LCA,显然选点更少的一棵。可以证明,重构的复杂度不超过$O(n\log_2^2n)$,于是启发式合并暴力重构即可。
代码:
1 |
|