【问题描述】
小奇的花园有 n 个温室,标号为 1 到 n,温室以及以及温室间的双向道路形成一
棵树。
每个温室都种植着一种花,随着季节的变换,温室里的花的种类也在不断发生着
变化。
小奇想知道从温室 x 走到温室 y 的路径中(包括两个端点),第 t 种花出现的次数。
【输入格式】
第一行为两个整数 n,q,表示温室的数目和操作的数目。
第二行有 n 个整数 T 1 ,T 2 ...T n 其中 T i 表示温室 i 中的花的种类。接下来 n-1 行,每个两个整数 x, y,表示温室 x 和 y 之间有一条双向道路。
接下来 q 行,表示 q 个操作,分别为以下两种形式之一:
• C x t 表示在温室 x 中的花的种类变为 t。
• Q x y t 表示询问温室 x 走到温室 y 的路径中(包括两个端点),第 t 种花出现
的次数。
为了体现在线操作,输入数据中的每个操作的参数都进行了加密。记最后一次询
问的答案为 anslast(一开始设 anslast 为 0),下次读入中的 x,y,t 均需要异或上
anslast 以得到真实值,在 C/C++中异或为ˆ运算符,在 pascal 中为 xor 运算符。
【输出格式】
输出 q 行,每行一个正整数表示该次询问答案。
【样例输入】
5 8
10 20 30 40 50
1 2
1 3
3 4
3 5
Q 2 5 10
C 2 21
Q 3 4 21
C 6 22
Q 1 7 28
C 5 20
Q 2 5 20
Q 2 0 9
【样例输出】
1
2
0
3
1
【样例解释】
加密前的操作:
Q 2 5 10
C 3 20
Q 2 5 20
C 4 20
Q 3 5 30
C 5 20
Q 2 5 20Q 1 3 10
【数据范围】
对于 30%的数据,有 n <= 1000, q <= 2000。
对于 50%的数据,有 n <= 10000, q <= 20000。
对于 100%的数据,有 n <= 100000, q <= 200000,0 <= T <= 2^31。
树链剖分
对于每一种颜色建一棵线段树,动态开点
颜色用map离散,最多300000种颜色
动态开店用内存池防止内存超限
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include