離散化處理

2022-09-14 16:45:21 字數 2847 閱讀 7273

題目描述

小魚有 n 名優秀的粉絲。

粉絲們得知小魚將會在一條直線上出現,打算去膜他。為了方便,粉絲們在這條直線上建立數軸。

第 i 名粉絲有乙個偵查區間[li,ri] 。如果小魚在 j(li≤j≤ri) 處出現,這名粉絲將立刻發現並膜他。

小魚希望膜他的人越多越好,但是他不能分身,因此只能選擇乙個位置出現。

小魚想知道自己最多能被多少個人膜。

輸入

第一行乙個整數n —— 粉絲的個數。

接下來 n 行,每行兩個整數 li,ri ,分別表示第 i 名粉絲的偵查區間的兩個端點。兩個數之間用空格隔開。

輸出

共一行,乙個整數,表示小魚最多能被多少人膜。

樣例輸入

4

3 54 8

1 25 10

樣例輸出3提示樣例解釋:

如圖所示,小魚可出現在5處,此時第1,2,4號粉絲可以膜他。小魚最多只能被3個粉絲膜。

對於20%的資料,n≤2

對於60%的資料,n≤2000

對於100%的資料,1 ≤ n ≤ 5 × 104,1 ≤ li ≤ ri <230

輸入的資料不超過 5e4,但是後面的區間範圍卻很大;

按照以前的思想,應該是進行差分處理,但是卻因為資料範圍太大而無法進行尋常的差分處理,這時就可以進行離散化處理;

離散化:比如輸入的有6個數 ,分別為: 1 9 100000000000 9999999999999999999 12312352346541236471263 1234

經過離散化之後這6個數分別代表 1 2 4 5 6 3

因此可以看出將資料從小到大進行排序,然後每個數可以換成排序之後的陣列的小標,這樣不會影響相互之間的大小關係,這樣一來,就可以使得以前比較大的資料範圍縮小了很大一部分,正適合我們的意願,但是可能有同乙個資料出現若干次的情況,這次就要進行去重處理

比如有 六個數分別為: 1 9 9999999999999999999 9999999999999999999 123123312312352346541236471263 9999999999999999999

那麼這六個數進行離散化就變成了:

1 2 3 3 4 3

因此離散化一般的過程就是: 排序去重

經常用stl裡面的不定長陣列,sort一遍之後,然後進行去重

vet.

erase

(unique

(vet.

begin()

,vet.

end())

,vet.

end())

;

erase用於刪除元素,常用的用法是:

vec.

erase

(vec.

begin()

+i,vec.

end(

)+j)

;刪除區間[i,j-1]

;區間從0開始

unique的作用是「去掉」容器中相鄰元素的重複元素(不一定要求陣列有序),它會把重複的元素新增到容器末尾(所以陣列大小並沒有改變),而返回值是去重之後的尾位址,下面舉個例子。

具體的話可以看巨巨的部落格

unique函式的去重過程實際上就是不停的把後面不重複的元素移到前面來,也可以說是用不重複的元素占領重複元素的位置。處理完之後,他的返回值是乙個迭代器,它指向的是去重後容器中不重複序列的最後乙個元素的下乙個元素。

unique 返回的是最後乙個去重完之後的元素的下乙個元素,而erase的時候,正好是將從這個元素開始到end的所有重複元素進行刪除

細心的小夥伴此時可能已經發現了,運用上面的兩個函式一起使用就可以達到真正的去重功能,因為erase之後直接將多餘的元素進行刪除了,容器的size也減小了

而用lower_bound二分後面的操作得到的下標就正好是第幾個元素,此時的下標就是每個元素對應的相對大小,也就是第幾大或者是第幾小

ll maxx=-1

,minn=inf;

ll num[maxn]

,a[maxn]

,num2[maxn]

;ll res,ans;

int n;

ll cnt[maxn]

;pair together[maxn]

;vector vet;

intmain()

;}sort

(vet.

begin()

,vet.

end())

; vet.

erase

(unique

(vet.

begin()

,vet.

end())

,vet.

end())

;for

(int i=

1;i<=n;i++

)int len=vet.

size()

;for

(int i=

1;i) num[i]

+=num[i-1]

; ans=num[0]

;for

(int i=

1;i(num[i]

>=ans) ans=num[i]

; cout<

return0;

}

離散化處理

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

離散化處理介紹

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

資料離散化處理

離散化,把無限空間中有限的個體對映到有限的空間中去,以此提高演算法的時空效率。通俗的說,離散化是在不改變資料相對大小的條件下,對資料進行相應的縮小。例如 原資料 1,999,100000,15 處理後 1,3,4,2 原資料 處理後 例如有時需要將資料直接作為陣列下標,但因為資料太大而無法開陣列時,...