离散化

离散化一般用于一个区间很大,但是给予的点很少的情况,用时间来换空间。

步骤1:再输入一个坐标的时候,把他们的x,y都加入A

A[tot++]=a[i].x;
A[tot++]=a[i].y;

步骤2:排序A

sort(A,A+tot);

步骤3:去重,unique()函数去掉重复的点,然后返回去重后的最后元素地址,减去A的地址,就是去重后的个数。

tot=unique(A,A+tot)-A;

步骤4:二分查找对应数值的位置

x=twosearch(a[i].x,0,tot-1);
y=twosearch(a[i].y,0,tot-1);
int twosearch(int x,int l,int r)
{
	while(l<=r)
	{
		int mid=(l+r)/2;
		if(A[mid]==x)
		return mid;
		if(A[mid]<x)l=mid+1;
		else
		r=mid-1;
	}
}

为了更好理解,举个例子:比如有3个点分别为(1,1000)(2,2500)(2,100000)。

那么排好序去重后的A=(1,2,1000,2500,100000)。然后我们就可以用(0,2)(1,3)(1,4)分别表示这3个点,这样就节省很多空间。注意一点就是如果题目的解法和区间长度有关则离散后会影响答案。但是很多题目解法跟区间长度无关,只跟区间位置有关则可离散。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值