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