ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

离散化算法

2022-07-28 12:31:46  阅读:120  来源: 互联网

标签:ch int mid 离散 算法 alls 哈希


离散化

什么是离散化?

  • 一些数据范围比较大,但是数据的个数不多,将其数字映射成较小的下标
  • 从本质上来看离散化可以看成哈希,是一种特殊的哈希,其保证数据在哈希以后仍然保持原来的顺序

离散化的步骤

  • 排序
  • 去重(排序好了才能去重,可以用stl中的unique去重然后用erase去除)
  • 访问的时候可以通过二分查找(因为是有序的)或者另外建立unordered_map通过find快速查找

离散化的核心板子(源自https://www.acwing.com/blog/content/277/)

vector<int> alls; // 存储所有待离散化的值
sort(alls.begin(), alls.end()); // 将所有值排序
alls.erase(unique(alls.begin(), alls.end()), alls.end());   // 去掉重复元素

// 二分求出x对应的离散化的值
int find(int x) // 找到第一个大于等于x的位置
{
    int l = 0, r = alls.size() - 1;
    while (l < r)
    {
        int mid = l + r >> 1;
        if (alls[mid] >= x) r = mid;
        else l = mid + 1;
    }
    return r + 1; // 映射到1, 2, ...n
}

离散化的板子题(题目源自https://www.acwing.com/problem/content/804/)

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 3e5 + 10;
typedef pair<int, int> PII;
int sum[N];
int n, m;
PII add[N], ask[N];
unordered_map<int, int> mmap;
vector<int>vec;
vector<int>::iterator unique(vector<int>& t) {
    int j = 0;
    for (int i = 0; i < t.size(); ++i) {
        if (!i || t[i] != t[i - 1]) t[j++] = t[i];
    }
    return t.begin() + j;
}
inline int read() {
    char ch = getchar();
    int s = 0, f = 1;
    for (;ch < '0' || ch > '9';ch = getchar()) if (ch = '-')f = -1;
    for (;ch >= '0' && ch <= '9';ch = getchar()) s = (s << 3) + (s << 1) + (ch ^ 48);
    return f == -1 ? -s : s;
}
signed main(void) {
    n = read(), m = read();
    for (int i = 1; i <= n;++i) {
        int x, c;
        x = read(), c = read();
        add[i] = make_pair(x, c);
        vec.push_back(x);
    }
    for (int i = 1; i <= m; ++i) {
        int l, r;
        l = read(), r = read();
        ask[i] = make_pair(l, r);
        vec.push_back(l), vec.push_back(r);
    }
    sort(vec.begin(), vec.end());
    //vec.erase(unique(vec.begin(), vec.end()), vec.end());  STL中的unique
    vec.erase(unique(vec), vec.end());
    for (int i = 0; i < vec.size(); ++i) mmap[vec[i]] = i + 1;
    for (int i = 1; i <= n; ++i) {
        int idx = mmap[add[i].first];
        sum[idx] += add[i].second;
    }

    for (int i = 1; i <= vec.size(); i++) {
        sum[i] += sum[i - 1];
    }
    for (int i = 1; i <= m; ++i) {
        int ll = mmap[ask[i].first], rr = mmap[ask[i].second];
        cout << sum[rr] - sum[ll - 1] << endl;
    }
}

标签:ch,int,mid,离散,算法,alls,哈希
来源: https://www.cnblogs.com/slbaba/p/16526185.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有