基礎演算法6 離散化

2021-10-21 17:28:17 字數 1066 閱讀 4074

問題引入: a[i]:1 3 100 2000 50000 對映到 0 1 2 3 4

解決問題1:a中可能重複元素

解決問題2:如何快速算出x離散化後的值

//n個新增操作,m個詢問操作

int n,m;

//a陣列存數,s陣列存字首和

int a[n],s[n];

//所有會用到的元素下標

vectoralls;

//新增操作,查詢操作

vectoradd,query;

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

int find(int x)

return r+1

}int main()

); alls.push_back(x);

}for(int i=0;i>l>>r;

query.push_back();

alls.push_back(l);

alls.push_back(r);

}sort(alls.begin(),alls.end());

alls.erase(unique(alls.begin(),alls.end()),alls.end());

for(auto item:add)

for(int i=1;i<=alls.size();i++) s[i]=s[i-1]+a[i];

for(auto item:query)

return 0;

}

基礎演算法 離散化

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

基礎演算法學習 離散化

題目給出範圍很大但資料數量很少的一組資料,通過離散化將大的下標的值賦值給新的較小的連續的下標,從而講乙個範圍很大的資料合集裝進乙個小的容器中。vecrotalls 儲存所有待離散化的值 sort alls.begin alls.end 將alls裡的所有待離散化的值總小到大排序 alls.erase...

演算法筆記 離散化

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