离散化与区间合并
离散化与区间和并
离散化
离散化的作用
若有一个值域很大但值的个数很少数组,我们要用下标做题,必定不能开特别长的数组
可以将下标映射到从从零开始的自然数
模板
离散化是将所有用到的下标都存到一个数组里面再去重,通过二分来找映射后的数组下标
模板如下
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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步