快去自定义签名吧~|

张詠然

园龄:3年6个月粉丝:3关注:3

离散化与区间合并

离散化与区间和并

离散化

离散化的作用

若有一个值域很大但值的个数很少数组,我们要用下标做题,必定不能开特别长的数组

可以将下标映射到从从零开始的自然数

模板

离散化是将所有用到的下标都存到一个数组里面再去重,通过二分来找映射后的数组下标

模板如下

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;
}

本文作者:张詠然

本文链接:https://www.cnblogs.com/zyrddd/p/16226046.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   张詠然  阅读(19)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起