離散化與區間合併

2021-10-13 07:12:45 字數 1373 閱讀 3109

區間合併

ps適用問題:

需要開闢長度很大的陣列統計資料(109),但實際使用的元素個數很少(105)

解決方法:

當值域大,但是個數小的一組數,可以通過離散化,將值對映為下標來縮小範圍

例如:

a[ ] : 1, 3, 100, 2000, 500000

↓   ↓    ↓      ↓           ↓

0   1    2     3           4

a[ ]中可能有重複元素,進行去重(一對一對映)

計算x離散化後的值(先排序後二分提高查詢效率)注意:離散後用到字首和時,二分返回的應是下標+1(字首和從i = 1開始)

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

}

把若干個區間合併成多個沒有交集的區間

按區間左端點排序

分類討論

a. 新區間為原區間的子區間

b. 新區間跟原區間有交集

c. 新區間跟原區間無交集

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

void

merge

(vector

&segs));

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

}else ed =

max(ed, seg.second);if

(st !=

-2e9

) res.

push_back()

; segs = res;

}感謝y總帶我入門,y總yyds!o(∩_∩)o

離散化與區間合併

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

離散化和區間合併演算法

離散化 離散化的本質,是對映,將間隔很大的點,對映到相鄰的陣列元素中。減少對空間的需求,也減少計算量。其實對映最大的難點是前後的對映關係,如何能夠將不連續的點對映到連續的陣列的下標 陣列存的是座標軸上的位置 此處的解決辦法就是開闢額外的陣列存放原來的陣列下標,或者說下標標誌,本文是原來上的數軸上的非...

離散化 區間和

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