离散化与区间合并

离散化与区间和并

离散化

离散化的作用

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

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

模板

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

模板如下

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;
}
posted @ 2022-05-05 19:30  张詠然  阅读(24)  评论(0)    收藏  举报