離散化和區間合併演算法

2022-09-19 06:15:12 字數 964 閱讀 1054

離散化:

離散化的本質,是對映,將間隔很大的點,對映到相鄰的陣列元素中。減少對空間的需求,也減少計算量。

其實對映最大的難點是前後的對映關係,如何能夠將不連續的點對映到連續的陣列的下標(陣列存的是座標軸上的位置)。此處的解決辦法就是開闢額外的陣列存放原來的陣列下標,或者說下標標誌,本文是原來上的數軸上的非連續點的橫座標。

此處的做法是是對原來的數軸下標進行排序,再去重,為什麼要去重呢,因為本題提前考慮了字首和的思想,其實很簡單,就是我們需要求出的區間內的和的兩端斷點不一定有元素,提前加如需要求字首和的兩個端點,有利於我們進行二分搜尋,其實二分搜尋裡面我們一般假定有解的,如果沒解的話需要特判,所以提前加入了這些元素,從而導致可能出現重複元素。

模板:vectoralls; // 儲存所有待離散化的值

sort(alls.begin(), alls.end()); // 將所有值排序

alls.erase(unique(alls.begin(), alls.end()), alls.end()); // 去掉重複元素

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

int find(int x)

return r + 1;

}認識下pair< , > 逗號兩邊各存乙個型別,呼叫第乙個用first,第二個用sceond。若對pai型別排序,率先排序的是左邊的型別,然後再排序右邊的型別。

auto型別:自動識別型別。

for(auto item : pp)  :這個語法大致意思是用item來遍歷pp中的元素。

區間合併:

模板:// 將所有存在交集的區間合併

void merge(vector&segs)

);st = seg.first, ed = seg.second;

}else ed = max(ed, seg.second);

if (st != -2e9) res.push_back();

segs = res;

}

離散化與區間合併

區間合併 ps適用問題 需要開闢長度很大的陣列統計資料 109 但實際使用的元素個數很少 105 解決方法 當值域大,但是個數小的一組數,可以通過離散化,將值對映為下標來縮小範圍 例如 a 1,3,100,2000,500000 0 1 2 3 4 a 中可能有重複元素,進行去重 一對一對映 計算x...

離散化與區間合併

若有乙個值域很大但值的個數很少陣列,我們要用下標做題,必定不能開特別長的陣列 可以將下標對映到從從零開始的自然數 離散化是將所有用到的下標都存到乙個陣列裡面再去重,通過二分來找對映後的陣列下標 模板如下 vectoralls alls存所有待離散化的值 sort alls.begin alls.en...

離散化 區間和

假定有乙個無限長的數軸,數軸上每個座標上的數都是0。現在,我們首先進行 n 次操作,每次操作將某一位置x上的數加c。近下來,進行 m 次詢問,每個詢問包含兩個整數l和r,你需要求出在區間 l,r 之間的所有數的和。輸入格式 第一行包含兩個整數n和m。接下來 n 行,每行包含兩個整數x和c。再接下裡 ...