模板 離散化實現的兩種方式

2021-08-03 15:48:40 字數 1323 閱讀 8091

第一種:利用結構體實現離散化

這種方法的弊端是無法辨別重複元素

例如 1 2 2 3 3

離散化之後是

1 2 3 4 5

使用時應注意

#include 

using

namespace

std;

const

int n=5e5+10;

int n;

int b[n];

struct node

sort(arr+1,arr+n+1);

for(int i=1;i<=n;i++) b[arr[i].id]=i;

for(int i=1;i<=n;i++) cout

<" ";

cout

<第二種:利用stl中的unique()和 lower_bound() 函式實現

unique函式:

去重函式

使用方法:unique (首位址,尾位址);

功能:去除相鄰的重複元素(只保留乙個),並把重複的元素放在最後;

unique 是返回去重後的尾位址;

lower_bound() 函式,在前閉後開區間進行二分查詢

lower_bound() 是返回》=val 的位置,當所有元素都小於val,返回last位置;

使用方法:lower_bound(首位址,尾位址,待查詢元素val);

upper_bound() 函式,在前閉後開區間進行二分查詢

upper_bound() 函式是返回》val 的位置,其餘與lower_bound()相同

#include

using

namespace

std;

const

int n=5e5+10;

int n;

int arr[n];

int b[n];

void print()

int main()

sort(b+1,b+n+1);

int m=unique(b+1,b+n+1)-b-1;

for(int i=1;i<=n;i++)

arr[i]=lower_bound(b+1,b+m,arr[i])-b;

print();

return

0;

}

離散化 兩種離散化方式詳解

離散化,就是把一些很離散的點給重新分配。舉個例子,如果乙個座標軸很長 1e10 給你1e4個座標,詢問某乙個點,座標比它小的點有多少。很容易就知道,對於1e4個點,我們不必把他們在座標軸上的位置都表示出來,因為我們比較有多少比它小的話,只需要知道他們之間的相對大小就可以,而不是絕對大小,這,就需要離...

離散化及兩種主要實現

離散化 所謂離散化就是當我們需要存一定數量的陣列時,陣列開不了那麼大,但是數字的種數不多,故離散化就是改變了資料數量的相對大小 去重離散化 給定乙個包含大量重複元素陣列,而我們用到其中的每乙個數即可,去重顯然是更好的選擇 unique函式 標頭檔案 include 注意 使用前一定要先將無序的列表排...

離散化的兩種操作

離散化是程式設計中乙個常用的技巧,它可以有效的降低時間複雜度。其基本思想就是在眾多可能的情況中,只考慮需要用的值。離散化可以改進乙個低效的演算法,甚至實現根本不可能實現的演算法。要掌握這個思想,必須從大量的題目中理解此方法的特點。有些資料本身很大,自身無法作為陣列的下標儲存對應的屬性。如果這時只是需...