区间区间又是区间…
对于一类范围很大,而实际用到的范围又很小的题目,如下题,数轴上的范围2*10^9次,而实际上有操作过的个数最多有n个,如果用前缀和计算该题的话在数据小的情况下是可以做的,但是本题范围若有前缀和的话遍历加每一个值也必然会tle,这时候我们就用到了离散化这个方法
**AcWing 802. 区间和 **
假定有一个无限长的数轴,数轴上每个坐标上的数都是 0。
现在,我们首先进行 n 次操作,每次操作将某一位置 x 上的数加 c。
接下来,进行 m 次询问,每个询问包含两个整数 l 和 r,你需要求出在区间 [l,r] 之间的所有数的和。
输入格式
第一行包含两个整数 n 和 m。
接下来 n 行,每行包含两个整数 x 和 c。
再接下来 m 行,每行包含两个整数 l 和 r。
输出格式
共 m 行,每行输出一个询问中所求的区间内数字和。
数据范围
−109≤x≤109
1≤n,m≤10^5
−109≤l≤r≤109
−10000≤c≤10000
输入样例:
1 | 3 3 |
输出样例:
1 | 8 |
题解:
把需要操作的位置都放到 all 数组里,对于操作的数据我们放在 add 内,对于要查询的区间我们放在 query 内,此外我们定义一个 find(x) 函数来查找数值为x的值在 all 数组内的下标,在放完所有数据之后,我们要对 all 数组内的值整理一次,先用sort使数据有序排列,这样才能保证在用find查找下标的时候有效进行,然后还得对 all 数组内相同的数据进行清除,然后遍历 add 内的值,给a数组进行赋值,再对all遍历计算有效前缀和,最后遍历query输出答案
1 | 例如: |
代码呈上😉😉😉😉
1 |
|