返回顶部

离散化

结构体:

int n,i,b[N];
struct stu{
    int x,id;
    bool operator<(stu &stu1)const{
         return x<stu1.x;
    }
}s[N];
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
    	scanf("%d",&s[i].x);
	s[i].id=i;
    }
    sort(s+1,s+1+n);
    for(i=1;i<=n;i++)b[s[i].id]=i;
    for(i=1;i<=n;i++)printf("%d ",b[i]);
}

STL(unique大法)

int n,i,a[N],b[N];
int main(){
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&a[i]);
        b[i]=a[i];
    }
    sort(a+1,a+1+n);
    int len=unique(a+1,a+1+n)-a-1;
    for(i=1;i<=n;i++){
        b[i]=lower_bound(a+1,a+1+len,b[i])-a;
    }
    for(i=1;i<=n;i++)printf("%d",b[i]);
    return 0;
}

STL(map大法)

int n,i,a[N],b[N],cnt;
map<int,int>mp;
int main(){
    scanf("%d"&n);
    for(i=1;i<=n;i++){
        scanf("%d",&a[i]);
        b[i]=a[i];
    }
    sort(a+1,a+1+n);
    for(i=1;i<=n;i++)
        mp[a[i]]=++cnt;
    for(i=1;i<=n;i++)
        printf("%d ",mp[b[i]]);
    return 0;
}

一些特殊情况

$\quad \ \ $ 当我们想要把数之间的相邻关系表示出来时,普通的离散化就会使数和数之间全部挨在一起,那种中间隔了一个数及以上的两数关系就会消失。
$\quad \ \ $ 只需要稍加改动即可(这里拿unique方法演示),在处理时判一下两数是否相邻,若不相邻就在过程数组后插入中间相隔的一个数,再排序。

int a[N],b[N],n,sum;
int main(){
	scanf("%d%d",&n,&m);
	sum=n;
	for(int i=1;i<=n;++i)sanf("%d",&a[i]),b[i]=a[i];
	sort(b+1,b+1+n);
	for(int i=2;i<=n;++i)if(b[i]-b[i-1]>1)b[++sum]=b[i-1]+1;
	sort(b+1,b+1+sum);
	int len=unique(b+1,b+1+sum)-b-1;
	for(int i=1;i<=n;++i)a[i]=lower_bound(b+1,b+1+len,a[i])-b;	
	for(int i=1;i<=n;i++)printf("%d\n",a[i]);
	//这种方法会失掉原先数据,时间复杂度相对较高。 
}

https://dl.acm.org/doi/pdf/10.1145/800061.808753

posted @ 2024-03-02 17:22  无敌の暗黑魔王  阅读(23)  评论(2编辑  收藏  举报