演算法 離散化 離散化的簡單實現與運用

2021-09-12 08:24:20 字數 2199 閱讀 8300

有一些數值的絕對數值過大,但是資料個數相對較小,為了方便統計,且需要去重,我們引入了離散化這一概念。在離散化中,每乙個絕對數值都對應的對映乙個離散數值。

例如有n=3時有三個數

\,這三個數的絕對數值較大,但是n較小,如果題目對絕對數值對答案沒有意義只是起到了相對大小的比較或者統計的作用,我們可以吧這三個數變成

\.這樣,我們可以直接用陣列標記。

把所有數從小到大排序,把每乙個不同的數值的第乙個點存入另乙個陣列,例如

\對映在另乙個陣列中就是

\.如果對於每乙個絕對數值需要查詢對映陣列的下標,因為序列是單調遞增的,所以二分查詢即可。

時間複雜度:o(n

logn

)o(nlogn)

o(nlog

n)。

void

discrete

(void

)

莫斯科正在舉辦乙個大型國際會議,有n個來自不同國家的科學家參會。

每個科學家都只懂得一種語言。

為了方便起見,我們把世界上的所有語言用1到109之間的整數編號。

在會議結束後,所有的科學家決定一起去看場電影放鬆一下。

他們去的電影院裡一共有m部電影正在上映,每部電影的語音和字幕都採用不同的語言。

對於觀影的科學家來說,如果能聽懂電影的語音,他就會很開心;如果能看懂字幕,他就會比較開心;如果全都不懂,他就會不開心。

現在科學家們決定大家看同一場電影。

請你幫忙選擇一部電影,可以讓觀影很開心的人最多。

如果有多部電影滿足條件,則在這些電影中挑選觀影比較開心的人最多的那一部。

輸入格式

第一行輸入乙個整數n,代表科學家的數量。

第二行輸入n個整數a1,a2…an,其中ai表示第i個科學家懂得的語言的編號。

第三行輸入乙個整數m,代表電影的數量。

第四行輸入m個整數b1,b2…bm,其中bi表示第i部電影的語音採用的語言的編號。

第五行輸入m個整數c1,c2…cm,其中ci表示第i部電影的字幕採用的語言的編號。

請注意對於同一部電影來說,bi≠ci。

同一行內數字用空格隔開。

輸出格式

輸出乙個整數,代表最終選擇的電影的編號。

如果答案不唯一,輸出任意乙個均可。

solution:

這道題目十分吻合離散化的特點,n,m

≤200000

n,m≤200000

n,m≤20

0000

,符合nlo

gn

nlogn

nlog

n的時間複雜度;且答案與語言無關。

我們要講語言離散化,對著2∗m

+n

2*m+n

2∗m+

n個語言進行離散化,時間複雜度:o((

2∗m+

n)lo

g(2∗

m+n)

)o((2*m+n)log(2*m+n))

o((2∗m

+n)l

og(2

∗m+n

)).然後再將科學家的每乙個語言都扔進桶內,列舉每乙個電影判斷即可。

**如下:

#include

using

namespace std;

int n,m,cnt=0;

int a[

200001];

int b[

200001];

int c[

200001];

int p[

600001];

int t[

600001];

int rank[

200001];

int tot[

600001];

map <

int,

int> vis;

void

discrete

(void

)int

main

(void)if

(tot[rank[n+i]

]== max1 && tot[rank[n+m+i]

]>max2)

}//列舉每乙個電影並統計答案

printf

("%d\n"

,ans)

;return0;

}

演算法筆記 離散化

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

離散化1(演算法)

對於值域比較大 0 10 9 對於這些值,我們需要把他們當成下標來做,我們可以把它對映到從1開始連續的陣列之中儲存 假設 a a有序 對映之後 1 0 3 1 100 2 2000 3 5000000 4 問題 a中可能存在重複元素 所以需要去重 vector int a 儲存所有待離散化的值 so...

基礎演算法 離散化

離散化主要是通過建立乙個對映,將分散的元素的位置對映成連續的位置以節約空間。說明 x為題目要進行操作的陣列元素的下標,y為經過離散化後的下標。原理 若不離散化,則針對該例需要開乙個大小為9000000的陣列儲存操作結果!通過建立乙個對映陣列來儲存所有要進行操作的下標x,然後將其排序去重,每次操作x位...