离散化与区间合并
离散化与区间和并
离散化
离散化的作用
若有一个值域很大但值的个数很少数组,我们要用下标做题,必定不能开特别长的数组
可以将下标映射到从从零开始的自然数
模板
离散化是将所有用到的下标都存到一个数组里面再去重,通过二分来找映射后的数组下标
模板如下
vector<int> alls; // alls存所有待离散化的值
sort(alls.begin(), alls.end()); // 将下标排序
alls.erase(unique(alls.begin(), alls.end()), alls.end());
// 二分找到对应的值,因为已经去重,所以二分可以随便写
int find(int x)
{
int l = 0, r = alls.size();
while (l < r)
{
int mid = l + r >> 1;
if (alls[mid] >= x) r = mid;
else l = mid + 1;
}
// 一般离散化为了前缀和和差分,所以映射到从1开始的自然数
return r + 1;
}
区间合并
区间和并的用法
有一种题,给定很多个区间,要求把有交集的区间全部合并为一个区间
模板
// 合并所有有交集的区间
void merge(vector<PII> &segs)
{
vector<PII> res;
sort(segs.begin(), segs.end());
int st = -2e9, ed = -2e9; // 取到每个题的负无穷
for (seg : segs)
if (ed < seg.first)
{
if (st != -2e9) res.push_back({st, ed});
st = seg.first, ed = seg.second;
}
else ed = max(ed, seg.second);
if (st != -2e9) res.push_back({st, ed});
segs = res;
}

浙公网安备 33010602011771号