若有乙個值域很大但值的個數很少陣列,我們要用下標做題,必定不能開特別長的陣列
可以將下標對映到從從零開始的自然數
離散化是將所有用到的下標都存到乙個陣列裡面再去重,通過二分來找對映後的陣列下標
模板如下
vectoralls; // alls存所有待離散化的值
sort(alls.begin(), alls.end()); // 將下標排序
alls.erase(unique(alls.begin(), alls.end()), alls.end());
// 二分找到對應的值,因為已經去重,所以二分可以隨便寫
int find(int x)
// 一般離散化為了字首和和差分,所以對映到從1開始的自然數
return r + 1;
}
有一種題,給定很多個區間,要求把有交集的區間全部合併為乙個區間
// 合併所有有交集的區間
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...
離散化和區間合併演算法
離散化 離散化的本質,是對映,將間隔很大的點,對映到相鄰的陣列元素中。減少對空間的需求,也減少計算量。其實對映最大的難點是前後的對映關係,如何能夠將不連續的點對映到連續的陣列的下標 陣列存的是座標軸上的位置 此處的解決辦法就是開闢額外的陣列存放原來的陣列下標,或者說下標標誌,本文是原來上的數軸上的非...
離散化 區間和
假定有乙個無限長的數軸,數軸上每個座標上的數都是0。現在,我們首先進行 n 次操作,每次操作將某一位置x上的數加c。近下來,進行 m 次詢問,每個詢問包含兩個整數l和r,你需要求出在區間 l,r 之間的所有數的和。輸入格式 第一行包含兩個整數n和m。接下來 n 行,每行包含兩個整數x和c。再接下裡 ...