- 离散化
- 当值域远大于数组长度,同时又需要以值域为下标时,将其值域映射
- 问题:
- 可能有重复元素,需要去重
- 如何算出离散化后的值(二分)
简单模板:
vector<int> a;//储存所有待离散化的值
sort(a.begin(),a.end());//将所有值排序
a.erase(unique(a.begin(),a.end()),a.end());//去重
//二分法求出x对应的离散化的值
int find(int x)//找到第一个大于等于x的位置
{
int l=0,r=a.size()-1;
while(l<r)
{
int mid=l+r>>1;
if(a[mid]>=x)r=mid;
else l=mid+1;
}
return r;
//return r+1;
//这个是映射到1,2,...到n
}
例题:假定有一个无限长的数轴,数轴上每个坐标上的数都是0。现在,我们首先进行n次操作,每次操作将某一位置x上的数加c。接下来,进行m次询问,每个询问包含两个整数l和r,你需要求出在区间[l,r]之间的所有数的和。
输入格式:第一行包含两个整数n和m。接下来n行,每行包含两个整数x和c。再接下里m行,每行包含两个整数l和r。