第一種:利用結構體實現離散化
這種方法的弊端是無法辨別重複元素
例如 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 注意 使用前一定要先將無序的列表排...
離散化的兩種操作
離散化是程式設計中乙個常用的技巧,它可以有效的降低時間複雜度。其基本思想就是在眾多可能的情況中,只考慮需要用的值。離散化可以改進乙個低效的演算法,甚至實現根本不可能實現的演算法。要掌握這個思想,必須從大量的題目中理解此方法的特點。有些資料本身很大,自身無法作為陣列的下標儲存對應的屬性。如果這時只是需...