码迷,mamicode.com
首页 > 其他好文 > 详细

离散化的一种姿势

时间:2015-04-12 20:59:59      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:

之前我的离散化方法一直用set和map做,感觉使用stl不够优越。刚刚发现线段树PPT给了一种离散化的新姿势。。。

技术分享

ax数组:要进行离散化的数组

bx数组:离散化后的数组

id数组:ax数组的rank数组。即排序后id[i]表示为ax数组中第i大的数的位置。 


如果要从原数->离散化后的数,还是需要用map,但是bx数组已经与ax数组形成了对应关系,所以map完全可以避免。

#include<bits/stdc++.h>
#define eps 1e-9
#define FOR(i,j,k) for(int i=j;i<=k;i++)
#define MAXN 1005
#define MAXM 40005
#define INF 0x3fffffff
#define PB push_back
#define MP make_pair
#define X first
#define Y second
#define lc (k<<1)
#define rc ((k<<1)1)
using namespace std;
typedef long long LL;
int i,j,k,n,m,x,y,T,ans,big,cas,num,len;
bool flag;

int ax[MAXN],bx[MAXN],mp[MAXN],id[MAXN];
bool cmp(const int &x,const int &y)
{
    return ax[x]<ax[y];
}

void discreatize(int n)
{
    for (int i=0;i<n;i++) id[i]=i;
    sort(id,id+n,cmp);//排序后id[i]表示为ax数组中第i大的数的位置。 
    mp[1]=ax[id[0]];//对应关系 
    bx[id[0]]=1;//bx数组为ax离散化后的数组。 
    for (int i=1,k=1;i<n;i++)
    {
        if (ax[id[i]]==ax[id[i-1]]) bx[id[i]]=k;
        else mp[++k]=ax[id[i]],bx[id[i]]=k;
    }
}
int main()
{
    scanf("%d",&n);
    for (i=0;i<n;i++) scanf("%d",&ax[i]);
    discreatize(n);
    printf("id:\n");
    for (i=0;i<n;i++) printf("%d ",id[i]);
    printf("\nbx:\n");
    for (i=0;i<n;i++) printf("%d ",bx[i]);
    printf("\n");
    return 0;
}

 

离散化的一种姿势

标签:

原文地址:http://www.cnblogs.com/zhyfzy/p/4420441.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!