区间合并与离散化处理
离散化
典例
题目描述:假定有一个无限长的数轴,数轴上每个坐标上的数都是 0。
现在,我们首先进行 n 次操作,每次操作将某一位置 x 上的数加 c。
接下来,进行 m 次询问,每个询问包含两个整数 l 和 r,你需要求出在区间
输入格式
第一行包含两个整数 n 和 m。
接下来 n 行,每行包含两个整数 x 和 c。
再接下来 m 行,每行包含两个整数 l和 r。
输出格式
共 m 行,每行输出一个询问中所求的区间内数字和。
数据范围
−10^9≤x≤10^9 1≤n,m≤10^5 −10^9≤l≤r≤10^9 −10000≤c≤10000
输入样例:
3 3
1 2
3 6
7 5
1 3
4 6
7 8输出样例:
8
0
5
code:
//分析:
//离散化:将数轴上离散的特定点映射到vector容器的连续下标上
//这样可以大大减少空间耗费,因为数轴上的点的范围是 -1e9~1e9,按理说我们应该开辟一个2e9大小的数组空间,这样的大小确实令人揪心...
//再者,区间和的得出是基于遍历数组的,也就是说我们要遍历2e9个位置,这耗时也是很恐怖的。
//所以,我们可以通过分析问题本质可知:题目给出的最坏情况是 n=m=1e5.所以添加操作时涉及到的点的个数最大为1e5
//询问操作(求区间和的询问)涉及到的点的个数最大为2e5,
//所以:我们可以只开 1e5 + 2e5 +10(这10个是为了防止边界问题) = 3e5 + 10 个空间就足以应付问题了,
//这是因为目标数据的稀疏性可以启发我们来做这样的优化
//这对于 2e9 的空间优化有着质的变化 耗时也会随之降低一个层级
//但是,这样的优化处理是基于一个成熟的映射思想的。