离散化一般用于一个区间很大,但是给予的点很少的情况,用时间来换空间。
步骤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个点,这样就节省很多空间。注意一点就是如果题目的解法和区间长度有关则离散后会影响答案。但是很多题目解法跟区间长度无关,只跟区间位置有关则可离散。