加载中...

离散化

特点: 值域大(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;
}


posted @ 2023-04-30 02:51  邪童  阅读(14)  评论(0编辑  收藏  举报