day 05 离散化

69 阅读1分钟
  1. 离散化
    1. 当值域远大于数组长度,同时又需要以值域为下标时,将其值域映射
    2. 问题:
      1. 可能有重复元素,需要去重
      2. 如何算出离散化后的值(二分)

简单模板:

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。

code.png