离散化
特点: 值域大(0 ~ \(10^9\)) , 个数少(\(10^5\))
\[\begin{CD} a[\quad] : \underbrace{1\quad2\quad5\quad8\quad10\quad\cdots\quad10^9}_{10^5个} @>{映射到从0开始的连续自然数}>{离散化}> 0,\quad1,\quad2,\quad\cdots,\quad n-1 \end{CD} \]
①
a[]
中可能有重复元素 \(\quad\) \(\quad\) 去重② 如何算出
x
离散化后的值 (在a[]
数组中的下标) \(\quad\) \(\quad\) 二分
//离散化模板
vector<int> alls; //存储所有待离散化的值
sort(alls.begin(),alls.end()); //将所有值排序
alls.erase(unique(alls.begin(),alls.end()),alls.end()); //去重
//二分求出x对应的离散化的值
int find (int x)
{
int l=0,r=alls.size()-1;
while(l<r)
{
int mid=(l+r)/2;
if(alls[mid]>=x)r=mid;
else l=mid+1;
}
return r;
}