ACM 離散化處理

2022-04-30 02:48:11 字數 1896 閱讀 7953

使用stl演算法離散化: 

思路:先排序,再刪除重複元素,然後就是索引元素離散化後對應的值。

1.  unique():

標頭檔案為algorithm

unique的作用是「去掉」容器中相鄰元素的重複元素(不一定要求陣列有序),它會把重複的元素新增到容器末尾(所以陣列大小並沒有改變),而返回值是去重之後的尾位址.由於返回的是容器末尾,所以如果想得到去重後的size,需要減去初始位址用法:sz = unique(a ,a + n)-a; sz為容器大小

unique()是c++標準庫函式裡面的函式,其功能是去除相鄰的重複元素(只保留乙個),所以使用前需要對陣列進行排序

上面的乙個使用中已經給出該函式的乙個使用方法,對於長度為n陣列a,unique(a,a+n) - a返回的是去重後的陣列長度

那它是怎麼實現去重的呢?刪除?

不是,它並沒有將重複的元素刪除,而是把重複的元素放到陣列的最後麵藏起來了

當把原長度的陣列整個輸出來就會發現:

**如下:

1 #include2 #include3 #include4

using

namespace

std;56

7int

n ;8

int a[1000];9

intmain()

10

16 sort(a,a+n);

17int k = unique(a,a+n) -a;

18for (int i = 0;i < n;++i)

19

2223

return0;

24 }

輸出的陣列如下:

其中 1 2 8 9 10就是去重後的陣列,我這裡把後面「藏起來」的數也輸出了,方便理解

2、lower_bound() 函式

前閉後開區間進行二分查詢函式lower_bound()在first和last中的前閉後開區間進行二分查詢

返回大於或等於val的第乙個元素位置。如果所有元素都小於val,則返回last的位置。

乙個陣列number序列為:4,10,11,30,69,70,96,100.

設要插入數字3,9,111.pos為要插入的位置的下標則pos = lower_bound( number, number + 8, 3) - number,pos = 0.即number陣列的下標為0的位置。

pos = lower_bound( number, number + 8, 9) - number, pos = 1,即number陣列的下標為1的位置(即10所在的位置)。

pos = lower_bound( number, number + 8, 111) - number, pos = 8,即number陣列的下標為8的位置(但下標上限為7,所以返回最後乙個元素的下乙個元素)。

所以,要記住:函式lower_bound()在first和last中的前閉後開區間進行二分查詢,返回大於或等於val的第乙個元素位置。如果所有元素都小於val,則返回last的位置,且last的位置是越界的!

一般是這樣用的

1、unique;       返回去重後的容器長度;

2\2、lower_bound             返回插入元素的位置;

離散化處理

作用 使資料的值域變小,便於根據值域構造樹狀陣列 線段樹等結構。步驟 輸入,排序,去重,索引。注意 離散化僅適用於只關注元素之間的大小關係而不關注元素本身的值。離散化處理 功能 將a陣列中的數離散化到x陣列,使值域變小 include include include using namespace ...

離散化處理

題目描述 小魚有 n 名優秀的粉絲。粉絲們得知小魚將會在一條直線上出現,打算去膜他。為了方便,粉絲們在這條直線上建立數軸。第 i 名粉絲有乙個偵查區間 li,ri 如果小魚在 j li j ri 處出現,這名粉絲將立刻發現並膜他。小魚希望膜他的人越多越好,但是他不能分身,因此只能選擇乙個位置出現。小...

離散化處理介紹

對於一串數字序列 或者乙個平面 我們要得到其中每個位置得相對位置,但這段數字可能存在間隔十分大,從而產生類似於稀疏矩陣這樣浪費空間的問題 這個形容可能不恰當 比如我們要對這段序列進行桶排序類似物的處理。這是我們可以對其進行求出相對位置 也可以理解為這個數字在這段序列中的排名 而不是原本的絕對位置,利...