Task Color
【题目描述】
给定一个长度为N的颜色序列C,对于该序列中的任意一个元素Ci,都有1<=Ci<=M。对于一种颜色ColorK来说,区间[L,R]内的权值定义为这种颜色在该区间中出现的次数的平方,即区间[L,R]内中满足Ci=ColorK的元素个数的平方。接下来给出Q个询问,询问区间[L,R]内颜色[a,b]的权值总和。
【输入数据】
第1行三个整数N,M,Q。分别代表序列长度,颜色总数和询问总数。
第2行N个整数,代表序列Ci。
第3行到第Q+2行,每行4个整数l,r,a,b。记上一次计算出的答案为Lans。那么实际的l,r,a,b为给出的l,r,a,b分别xor上Lans。第一个询问的时候Lans=0。
【输出数据】
总共Q行,对于每一个询问,输出权值总和。
【样例输入】
4 2 3
1 1 2 2
1 4 1 2
10 11 9 10
3 0 0 0
【样例输出】
8
2
0
【数据范围】
40% :1<=N,Q<=10000
100%:1<=N,Q<=50000
一开始看到数据范围线段树是会挂的,有想到过分块处理,但是实在想不出平方和怎么一起计算出来,所以写了个暴力树状数组(其实根本不用)交了。
之后 Orz cwx,得知可以分段预处理每一段颜色的平方前缀和,对于块之外的杂碎,O(段长) 扫一遍即可, 每遇到一个答案加上原计数器 * 2 + 1,++ 原计数器即可。