學習筆記 離散化

2021-10-18 13:09:42 字數 2562 閱讀 2616

離散化 是把無限空間中有限的個體對映到有限的空間中去,以此提高演算法的時空效率。通俗的說,離散化是在不改變資料相對大小的條件下,對資料進行相應的縮小。

看乙個例子:

acwing 802. 區間和

假定有乙個無限長的數軸,數軸上每個座標上的數都是0。

現在,我們首先進行 n 次操作,每次操作將某一位置x上的數加c。

接下來,進行 m 次詢問,每個詢問包含兩個整數l和r,你需要求出在區間[l, r]之間的所有數的和。

(-1e9 <= x,l,r <= 1e9, 1 <= n,m <= 1e5, -1e4 <= c <= 1e4)

做法:可以看出,我們不能簡單的將座標作為陣列下標,因為座標的範圍很大,陣列開不了這麼大,但是我們發現儘管座標的範圍非常大,但是用到的座標是有限個的,因為最多只有(m+n)次詢問,就算每次詢問都會用到乙個不同的座標,最多會有3e5個不同的座標被用到,這個範圍是可以接受的

所以做法就是 將座標離散化,最後用字首和處理一遍,輸出答案

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define ull unsigned long long

#define up_b upper_bound

#define low_b lower_bound

#define m_p make_pair

#define mem(a) memset(a,0,sizeof(a))

#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)

#define inf 0x3f3f3f3f

#define endl '\n'

#include

using

namespace std;

inline ll read()

while

('0'

<=ch&&ch<=

'9') x=x*

10+ch-

'0', ch=

getchar()

;return f*x;

}const

int maxn =

3e5+5;

int n,m;

int a[maxn]

,s[maxn]

;vector<

int> alls;

//存放待離散化的座標

vectorint,

int>

> add,query;

//存放新增操作與詢問操作

intfind

(int x)

//查詢座標x離散化後對應的陣列下標

return r+1;

//將x對映到1,2...n

// 如果 return r; 是對映到 0,1,2...

}int

main()

for(

int i=

0;i)// 排序 + 去重

sort

(alls.

begin()

,alls.

end())

; alls.

erase

(unique

(alls.

begin()

,alls.

end())

,alls.

end())

;//處理新增操作

for(

int i=

0;i)//對陣列a進行字首和處理

for(

int i=

1;i<=alls.

size()

;i++

) s[i]

=s[i-1]

+a[i]

;//處理查詢操作

for(

int i=

0;i)return0;

}

y總的離散化模版:

vector<

int> alls;

// 儲存所有待離散化的值

sort

(alls.

begin()

, alls.

end())

;// 將所有值排序

alls.

erase

(unique

(alls.

begin()

, alls.

end())

, alls.

end())

;// 去掉重複元素

// 二分求出x對應的離散化的值

intfind

(int x)

// 找到第乙個大於等於x的位置

return r +1;

// 對映到1, 2, ...n

}

演算法筆記 離散化

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

演算法學習筆記 14 離散化操作

離散化是一種輔助解決問題的操作,當問題中涉及的資料範圍非常大,但是實際使用到的資料是比較少的。並且問題的求解是和它範圍裡的其它資料有關係的,那麼可以將這些可能使用到的資料放到一起,排序去重,就將它們對映到了乙個新的較小的範圍裡。例如,下面幾個數是在 infty,infty 範圍裡的,實際用到的數 6...

演算法筆記 初識離散化

對於一些數值很大但數量不大的數,我們更關心它們的相對大小,更想要知道這個數是第幾大或者第幾小,這個時候就需要把這些數離散化。感謝大佬 include include include define maxn 1005 using namespace std int main sort t 1,t 1 ...