离散化是什么:一些数字,他们的范围很大(0-1e9),但是个数不算多(1-1e5),并且这些数本身的数字大小不重要,重要的是这些数字之间的相对大小。
方法1: 包含重复元素,并且相同元素离散化后也要相同,很常用。
int n;
int s[Max_n],t[Max_n];
for(int i=1;i<=n;i++){
scanf("%d",&s[i]);
t[i]=s[i];
}
sort(t+1,t+n+1);
int m=unique(t+1,t+n+1)-t-1; //m为不重复元素的个数
for(int i=1;i<=n;i++){
s[i]=lower_bound(t+1,t+m+1,s[i])-t;
}
原来的s数组(6 9 4 6 4)离散后成新的s数组(2 3 1 2 1)。
方法2: 不管是否含有重复元素,元素离散化后各不相同。
int n;
struct node{
int x,id;
operator<(const node& no)const{
return x<no.x;
}
}no[Max_n];
int s[Max_n];
for(int i=1;i<=n;i++){
scanf("%d",&no[i].x);
no[i].id=i;
}
sort(no+1,no+n+1);
for(int i=1;i<=n;i++)s[no[i].id]=i;
原来的s数组(6 9 4 6 4)离散后成新的s数组(3 5 1 4 2)。
66666666666666666666666666