3531: [Sdoi2014]旅行
Time Limit: 20 Sec
Memory Limit: 512 MB
Submit: 1591
Solved: 708
[ Submit][ Status][ Discuss]
Description
S国有N个城市,编号从1到N。城市间用N-1条双向道路连接,满足
从一个城市出发可以到达其它所有城市。每个城市信仰不同的宗教,如飞天面条神教、隐形独角兽教、绝地教都是常见的信仰。为了方便,我们用不同的正整数代表各种宗教, S国的居民常常旅行。旅行时他们总会走最短路,并且为了避免麻烦,只在信仰和他们相同的城市留宿。当然旅程的终点也是信仰与他相同的城市。S国政府为每个城市标定了不同的旅行评级,旅行者们常会记下途中(包括起点和终点)留宿过的城市的评级总和或最大值。
在S国的历史上常会发生以下几种事件:
”CC x c”:城市x的居民全体改信了c教;
”CW x w”:城市x的评级调整为w;
”QS x y”:一位旅行者从城市x出发,到城市y,并记下了途中留宿过的城市的评级总和;
”QM x y”:一位旅行者从城市x出发,到城市y,并记下了途中留宿过
的城市的评级最大值。
由于年代久远,旅行者记下的数字已经遗失了,但记录开始之前每座城市的信仰与评级,还有事件记录本身是完好的。请根据这些信息,还原旅行者记下的数字。 为了方便,我们认为事件之间的间隔足够长,以致在任意一次旅行中,所有城市的评级和信仰保持不变。
Input
输入的第一行包含整数N,Q依次表示城市数和事件数。
接下来N行,第i+l行两个整数Wi,Ci依次表示记录开始之前,城市i的
评级和信仰。
接下来N-1行每行两个整数x,y表示一条双向道路。
接下来Q行,每行一个操作,格式如上所述。
Output
对每个QS和QM事件,输出一行,表示旅行者记下的数字。
Sample Input
5 6
3 1
2 3
1 2
3 3
5 1
1 2
1 3
3 4
3 5
QS 1 5
CC 3 1
QS 1 5
CW 3 3
QS 1 5
QM 2 4
Sample Output
8
9
11
3
HINT
N,Q < =10^5 , C < =10^5
数据保证对所有QS和QM事件,起点和终点城市的信仰相同;在任意时
刻,城市的评级总是不大于10^4的正整数,且宗教值不大于C。
Source
[ Submit][ Status][ Discuss]
树上修改和询问,很容易想到用LCT解决
但是还有一个关键字是宗教,,总不可能每个节点开n个点维护宗教??
建立n棵树,第i棵树是信仰宗教i的全体子孙的信息,,用LCT维护
这当然是开不下的,,,但是,每次实际需要存的节点信息其实不多
因此,开n棵虚树,用LCT维护虚树,复杂度O(nlogn),,
但是,,常数巨大。。。。。。。。卡常卡了老半天。。。
加了两个小优化过的,,
首先,每个原来的点的信息先储存好,这样建树的时候就直接调用点,不用建完树再重新维护
然后,rotate的时候少个maintain,对于当前splay的节点,留到最后maintain一次就行了
虚树的建立都差点忘光了。。。假设要对n个点建立虚树
把这些点按照dfs序排好,相邻点求lca,如果不在当前集合则新增入集合中
再按dfs排好,维护一个栈,集合内所有元素按顺序入栈
如果栈顶是当前点的祖先,当前点直接入栈
否则当前栈顶不断弹出,每次栈顶与栈顶下面的那个点连边,直到栈顶点是当前点的祖先
最后,剩下的栈内元素一一弹出连边即可
#include
#include
#include
#include
#include
#include
#include
#include