离散化小记

感觉现在写个啥都得搞离散化orz
目前已知的离散化方式:
1.手写多累,用map啊(可能会被卡掉)
map<int,int>即可
2.vector离散化(应该没有手写快,不过一般不会被卡)
我们将要离散化的所有数存进vector里,排序。查询一个数被离散化之后的值用lower_bound即可

for(int i=1;i<=n;i++)
 a[i]=read(),vec.push_back(a[i]);//vec就是定义的vector
sort(vec.begin(),vec.end());
for(int i=1;i<=n;i++)
 a[i]=lower_bound(vec.begin(),vec.end(),c)-vec.begin()+1;//下标从1开始

3.参照vector离散化的思路,手写离散化
就是把所有元素存进一个数组里(在你知道上限的情况下),排序,手写lower_bound即可

int n,be[N],ae[N],t;//N根据题目确定
int lower_bound(int kkk)
{
	int ll=1,rr=t;
	while(ll<=rr)
	{
		int mid=(ll+rr)>>1;
		if(ae[mid]==kkk) return mid;
		if(ae[mid]>kkk)rr=mid-1;
		else ll=mid+1;
	}
	if(ae[ll]>kkk)ll--;//写丑了的lower_bound
	return ll;
}
int main()
{
   for(int i=1;i<=n;i++)
   {
   	be[i]=read();ae[i]=be[i];
   }
   sort(ae+1,ae+1+n);
   t=unique(ae+1,ae+1+n)-ae-1;
   for(int i=1;i<=n;i++)
    be[i]=lower_bound(be[i]);
}

虽然费事,但跑的快

posted @ 2019-11-01 14:50  千载煜  阅读(157)  评论(0编辑  收藏  举报