离散化算法

简介: 如果数据范围不超过10^5可以用前缀和否则就要用离散化

如果数据范围不超过10^5可以用前缀和

否则就要用离散化


802. 区间和 - AcWing题库

5.2.png

视频讲解AcWing 802. 区间和 - AcWing 

image.png

//排序+去重
sort(alls.begin(), alls.end());
alls.erase(unique(alls.begin(), alls.end()), alls.end());
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,因为前缀和处理的时候我们都是从下标1开始的
}

image.png

😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️

image.png

a数组里面存储的是得把某个位置+c后的值

注意a数组与alls数组不一样

一定得多写几遍,第一次可以边抄边想,第二次可以默写

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef pair<int, int> PII;
const int N = 300010;
int n, m;
int a[N], s[N];
vector<int> alls;
vector<PII> add, query;
int find(int x)
{
    int l = 0, r = alls.size() - 1;
    while (l < r)
    {
        int mid = l + r >> 1;
        if (alls[mid] >= x) r = mid;//这里是alls数组,不是a数组
        else l = mid + 1;
    }
    return r + 1;//映射到以1开头的数(因为咱们这里用到的前缀和是以1开头的)
}
int main()
{
    cin >> n >> m;
    for (int i = 0; i < n; i ++ )
    {
        int x, c;
        cin >> x >> c;
        add.push_back({x, c});
        alls.push_back(x);
    }
    for (int i = 0; i < m; i ++ )
    {
        int l, r;
        cin >> l >> r;
        query.push_back({l, r});
        alls.push_back(l);//alls数组里面都是得离散化的
        alls.push_back(r);//我感觉因为加入了l r,所以前面得查重
    }
    // 去重
    sort(alls.begin(), alls.end());
    alls.erase(unique(alls.begin(), alls.end()), alls.end());
    // 处理插入
    for (auto item : add)
    {
        int x = find(item.first);//注意是item.first,不是alls.first
        a[x] += item.second;
    }
    // 预处理前缀和
    for (int i = 1; i <= alls.size(); i ++ ) s[i] = s[i - 1] + a[i];
    // 处理询问
    for (auto item : query)
    {
        int l = find(item.first), r = find(item.second);
        cout << s[r] - s[l - 1] << endl;
    }
    return 0;
}
相关文章
|
存储 算法 C++
C++基础算法离散化及区间合并篇
C++基础算法离散化及区间合并篇
157 0
|
6月前
|
人工智能 算法 C++
c++算法学习笔记 (11) 离散化
c++算法学习笔记 (11) 离散化
|
6月前
|
存储 机器学习/深度学习 人工智能
【算法基础】基础算法(三)--(双指针算法、位运算、离散化、区间合并)
【算法基础】基础算法(三)--(双指针算法、位运算、离散化、区间合并)
|
算法
基础算法:离散化的基本应用
基础算法:离散化的基本应用
110 0
|
算法
离散化算法
离散化算法
70 0
|
机器学习/深度学习 传感器 算法
基于中心差分有限离散化和 Newton Raphson 算法求解NACA 翼型二维不可压缩和可压缩流动附matlab代码
基于中心差分有限离散化和 Newton Raphson 算法求解NACA 翼型二维不可压缩和可压缩流动附matlab代码
|
算法 C++ 容器
基础算法-离散化
1. 离散化简介 离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。 离散化本质上可以看成是一种哈希,其保证数据在哈希以后仍然保持原来的全/偏序关系。 当有些数据因为本身很大或者类型不支持,自身无法作为数组的下标来方便地处理,而影响最终结果的只有元素之间的相对大小关系时,我们可以将原来的数据按照从大到小编号来处理问题,即离散化。 本文针对 整数、有序数组 进行离散化。
|
人工智能 算法
ACM算法训练【区间和·离散化】
1.离散化 离散化:适合条件 (数字的值域非常大,但是个数非常少) 什么是离散化:把值域大的数字的序列映射到从0开始的自然数数组里(无法开辟出值域那么大的数组)
158 1
ACM算法训练【区间和·离散化】
|
算法
【算法竞赛进阶指南】程序自动分析(并查集判冲突+离散化)
【算法竞赛进阶指南】程序自动分析(并查集判冲突+离散化)
128 0
|
29天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
下一篇
无影云桌面