[分块处理] Color

博客讨论了如何使用分块处理解决数据范围线段树无法处理的问题。通过分段预处理每段颜色的平方前缀和,再对块外部分进行O(段长)扫描,更新答案和计数器,从而避免了复杂操作。作者表达了对这种方法在时间、空间效率上的疑虑。
摘要由CSDN通过智能技术生成
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,++ 原计数器即可。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值