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;
}
目录
相关文章
|
2月前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
127 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
1月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
2月前
|
机器学习/深度学习 算法 决策智能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
|
2月前
|
算法 Java C++
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
|
2月前
|
算法 C++
蓝桥 算法训练 共线(C++)
蓝桥 算法训练 共线(C++)
|
5月前
knn增强数据训练
【7月更文挑战第27天】
46 10
|
5月前
knn增强数据训练
【7月更文挑战第28天】
51 2
|
5月前
|
人工智能 边缘计算 算法
破解ChatGPT惊人耗电!DeepMind新算法训练提效13倍,能耗暴降10倍
【7月更文挑战第20天】DeepMind unveils Switch Transformer, revolutionizing AI energy consumption. This novel algorithm boosts training efficiency by 13x and slashes energy use by 10x compared to ChatGPT, marking a significant leap towards eco-friendly AI.
55 2
|
4月前
|
算法 搜索推荐
支付宝商业化广告算法问题之基于pretrain—>finetune范式的知识迁移中,finetune阶段全参数训练与部分参数训练的效果如何比较
支付宝商业化广告算法问题之基于pretrain—>finetune范式的知识迁移中,finetune阶段全参数训练与部分参数训练的效果如何比较
|
4月前
|
存储 算法
【C算法】编程初学者入门训练140道(1~20)
【C算法】编程初学者入门训练140道(1~20)