ACM算法训练【区间和·离散化】

简介: 1.离散化离散化:适合条件 (数字的值域非常大,但是个数非常少)什么是离散化:把值域大的数字的序列映射到从0开始的自然数数组里(无法开辟出值域那么大的数组)


1.离散


离散化:适合条件 (数字的值域非常大,但是个数非常少)

什么是离散化:把值域大的数字的序列映射到从0开始的自然数数组里(无法开辟出值域那么大的数组)


03eed17f48a74f5fa6aa2dda051820d3.png


注意:① a中可能有重复元素,需要去重(erase,unique)
② 算出a[i]离散化后的值,需要使用二分思想
③离散化的本质,是映射,将间隔很大的点,映射到相邻的数组元素中。减少对空间的需求,也减少计算量


2.题目描述


b4286d80b80f4cf2a91bab53fb87da8a.png


输入样例:


3 3
1 2
3 6
7 5
1 3
4 6
7 8


输出样例:


8
0
5


3.代码实现


思路:

利用离散化的思想,映射数字


#include <bits/stdc++.h>
using namespace std;
const int N = 300010;
int a[N],s[N];                //原数组和前缀和数组
vector<int> alls;             //存储离散化后下标的数组
typedef pair<int,int> PII;   //定义pair类型
vector<PII> add,query;        //插入和查找的数据结构
//二分索引
int findx(int x)
{
    int l=0,r=alls.size()-1;
    while(l<r)
    {
        int mid=(l+r)/2;
        if(alls[mid]>=x) r=mid;
        else l=mid+1;
    }
    return r+1;
}
int main()
{
    int n,m;
    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.push_back(r);
    }
    //排序后去重
    sort(alls.begin(),alls.end());
    alls.erase(unique(alls.begin(),alls.end()),alls.end());
    //处理插入
    for(auto item : add)
    {
        int x=item.first,c=item.second;
        a[findx(x)] += c;
    }
    //求前缀和
    for(int i=1;i<=alls.size();i++)
        s[i]=s[i-1]+a[i];
    //处理查询
    for(auto item : query)
    {
        int l=findx(item.first),r=findx(item.second);
        printf("%d\n",s[r]-s[l-1]);
    }
    return 0;
}
目录
相关文章
|
4月前
|
算法 测试技术 C#
C++二分查找算法:包含每个查询的最小区间
C++二分查找算法:包含每个查询的最小区间
|
3月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1 算法训练 区间k大数查询
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1 算法训练 区间k大数查询
18 0
|
6月前
|
存储 算法 C++
C++基础算法离散化及区间合并篇
C++基础算法离散化及区间合并篇
|
4月前
|
算法 测试技术 C#
【map】【滑动窗口】C++算法:最小区间
【map】【滑动窗口】C++算法:最小区间
|
4月前
|
存储 算法 索引
算法题解-汇总区间
算法题解-汇总区间
|
5月前
|
算法 Java
算法编程(十八):汇总区间
算法编程(十八):汇总区间
34 0
|
5月前
|
算法 程序员
【算法训练-链表 一】【反转链表】反转链表、区间反转链表、K个一组反转链表
【算法训练-链表 一】【反转链表】反转链表、区间反转链表、K个一组反转链表
31 0
|
5月前
|
算法 测试技术 C#
C++ 算法:区间和的个数
C++ 算法:区间和的个数
|
5月前
|
算法 测试技术 C#
C++二分查找算法的应用:将数据流变为多个不相交区间
C++二分查找算法的应用:将数据流变为多个不相交区间
|
6月前
|
人工智能 算法
代码随想录算法训练营第三十五天 | LeetCode 435. 无重叠区间、763. 划分字母区间、56. 合并区间
代码随想录算法训练营第三十五天 | LeetCode 435. 无重叠区间、763. 划分字母区间、56. 合并区间
41 0