離散化 是把無限空間中有限的個體對映到有限的空間中去,以此提高演算法的時空效率。通俗的說,離散化是在不改變資料相對大小的條件下,對資料進行相應的縮小。
看乙個例子:
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 ...