生活随笔
收集整理的這篇文章主要介紹了
离散化的一种姿势
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
之前我的離散化方法一直用set和map做,感覺使用stl不夠優(yōu)越。剛剛發(fā)現(xiàn)線段樹PPT給了一種離散化的新姿勢。。。
ax數(shù)組:要進(jìn)行離散化的數(shù)組
bx數(shù)組:離散化后的數(shù)組
id數(shù)組:ax數(shù)組的rank數(shù)組。即排序后id[i]表示為ax數(shù)組中第i大的數(shù)的位置。?
如果要從原數(shù)->離散化后的數(shù),還是需要用map,但是bx數(shù)組已經(jīng)與ax數(shù)組形成了對應(yīng)關(guān)系,所以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數(shù)組中第i大的數(shù)的位置。 mp[
1]=ax[id[
0]];
//對應(yīng)關(guān)系 bx[id[
0]]=
1;
//bx數(shù)組為ax離散化后的數(shù)組。 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;
} ?
轉(zhuǎn)載于:https://www.cnblogs.com/zhyfzy/p/4420441.html
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖
總結(jié)
以上是生活随笔為你收集整理的离散化的一种姿势的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。