原题链接:活动 - AcWing

问题简述:

假定有一个无限长的数轴,数轴上每个坐标上的数都是 00。

现在,我们首先进行 nn 次操作,每次操作将某一位置 xx 上的数加 cc。

接下来,进行 mm 次询问,每个询问包含两个整数 ll 和 rr,你需要求出在区间 [l,r][l,r] 之间的所有数的和。

输入格式

第一行包含两个整数 nn 和 mm。

接下来 nn 行,每行包含两个整数 xx 和 cc。

再接下来 mm 行,每行包含两个整数 ll 和 rr。

输出格式

共 mm 行,每行输出一个询问中所求的区间内数字和。

数据范围

−1e9≤x≤1e9,
1≤n,m≤1e5,
−1e9≤l≤r≤1e9,
−10000≤c≤10000−10000≤c≤10000

输入样例:

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

输出样例:

8
0
5

这是一道典型的离散化处理的题目 。

问题一:为什么不能用哈希或者是开个数组存呢?

很显然不行,因为这道题数据范围实在是太大了,所以但是并不是每个点都用上了,真正有过添加值的点最多不过1e5因此我们需要考虑的就是如何处理这1e5个数了。

首先,我们需要把所有的数映射到一个数组里面,这样就可以降低时间复杂度,那么如何实现呢?我们可以用一下思路。

原始数组:-1 -2 6 7 6

下标:         1 2 3 4 5

排列:-2 -1 6  6  7

下标: 2  1  3  5 4

重新排列下标并去重:-2 -1  6  7

下标:                           1  2  3 4

ok经过上述推到我们手动模拟了离散化,现在我们只需要把给定区间的l和r通过二分找到前缀数组的左右边界就可以得到答案就是前缀和数组a[r]-a[l-1]。

代码实现:

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int s[N],a[N];
int cnt=1,sz,max1=0,min1=1e9;
int findl(int x)//查询左边界
{int ll=1,rr=sz;while(ll<rr){int mid=(ll+rr)>>1;if(s[mid]>=x) rr=mid;else ll=mid+1;}return ll;
}
int findr(int x)//查询右边界
{int ll=1,rr=sz;while(ll<rr){int mid=(ll+rr+1)>>1;if(s[mid]<=x) ll=mid;else rr=mid-1;}return ll;
}
int main()
{map<int,int> p;//用于储存每次相加后的值int n,m;cin>>n>>m;while(n--) {int x,y;cin>>x>>y;p[x]+=y;s[cnt++]=x;max1=max(max1,x);//判断左右边界min1=min(min1,x);}sort(s+1,s+cnt+1);sz=unique(s+1,s+cnt+1)-(s+1);for(int i=1;i<=sz;i++)a[i]=a[i-1]+p[s[i]];while(m--){int l,r;cin>>l>>r;if(l>max1||r<min1) cout<<0<<endl;//如果该区间内没有加过任何数直接输出0else{int cnt1=findl(l),cnt2=findr(r);cout<<a[cnt2]-a[cnt1-1]<<endl;}}return 0;
}

区间和问题——离散化相关推荐

  1. 802. 区间和(离散化)

    题目描述 假定有一个无限长的数轴,数轴上每个坐标上的数都是0. 现在,我们首先进行 n 次操作,每次操作将某一位置x上的数加c. 近下来,进行 m 次询问,每个询问包含两个整数l和r,你需要求出在区间 ...

  2. 【HDU - 4509】湫湫系列故事——减肥记II(合并区间模板 or 离散化标记 or 线段树)

    题干: 虽然制定了减肥食谱,但是湫湫显然克制不住吃货的本能,根本没有按照食谱行动!  于是,结果显而易见-  但是没有什么能难倒高智商美女湫湫的,她决定另寻对策--吃没关系,咱吃进去再运动运动消耗掉不 ...

  3. CodeForces - 1285E Delete a Segmen(线段树+区间合并+离散化)

    题目链接:点击查看 题目大意:给出n个线段代表集合,现在问若可以将其中任意一个线段删除,则能够形成最多多少个独立的集合(取并集后) 题目分析:看到区间不难想到线段树了,虽然这个题也可以用stl贪心做, ...

  4. POJ Mayor's posters——线段树+离散化

    原文:http://blog.163.com/cuiqiongjie@126/blog/static/85642734201261151553308/ 大致题意: 有一面墙,被等分为1QW份,一份的宽 ...

  5. 连续特征离散化--汇总

    说明:本文内容来自网络,此处仅是简单汇总 内容一 来源:https://www.cnblogs.com/-Sai-/p/6707327.html 在工业界,很少直接将连续值作为逻辑回归模型的特征输入, ...

  6. CART与ID3的区别C4.5离散化的过程

    一.CART与ID3的区别 通过之前的研究发现,CART与ID3算法都是基于信息论的决策树算法,CART算法是一种通过计算Diversity(整体)-diversity(左节点)-diversity( ...

  7. python 离散化_数据离散化与Python实现

    一.原理 数据离散化(也称,数据分组),指将连续的数据进行分组,使其变为一段离散化的区间. 根据离散化过程中是否考虑类别属性,可以将离散化算法分为:有监督算法和无监督算法.事实证明,由于有监督算法充分 ...

  8. 数据预处理Part4——数据离散化

    文章目录 离散化,对数据做逻辑分层 1. 什么是数据离散化? 2. 为什么要将数据离散化 3. 如何将数据离散化? 3.1 时间数据离散化 3.2 多值离散数据离散化 3.3 连续数据离散化 3.4 ...

  9. 数据离散化与Python实现

    一.原理         数据离散化(也称,数据分组),指将连续的数据进行分组,使其变为一段离散化的区间. 根据离散化过程中是否考虑类别属性,可以将离散化算法分为:有监督算法和无监督算法.事实证明,由 ...

最新文章

  1. 同步和串行的区别_[深度思考]·为什么CNN是同步(并行)而RNN是异步(串行)的呢?...
  2. PLMN概念和应用设置
  3. 第五节 19可空数据类型
  4. controller层没反应_埋地管道防腐层探测检漏仪FJ-10地下管线探测仪的说明及应用...
  5. Python树莓派编程1.2 探索树莓派
  6. 使用Java 8 Lambda清理JUnit Throwable-Tests
  7. QString与char *之间的转换
  8. Android之TextView属性详解
  9. 线程间通讯《代码》pthread_cond_wait/signal
  10. java打印空心金字塔
  11. hadoop yarn 获取日志_「大数据」「Hadoop」-安装及数据目录
  12. struts 2 时间控件
  13. JZ3-从尾到头打印链表
  14. TTL转USB TTL 232 CH340
  15. 固态硬盘比机械硬盘到底快多少呢
  16. 教你如何安装字体包 ——思源免费商用字体
  17. 【你好,windows】win10 1709 X86X64(16299.1029)专业纯净版2021.4.10
  18. 微信白名单服务器ip地址,微信服务器白名单IP列表
  19. MySQL中varchar最大长度是多少(真正的官网解释,事实说话)
  20. cv2.putText()函数中各个参数含义

热门文章

  1. 5G来临,射频芯片与基带技术演进和产业链。
  2. Android——TabLayout设置选中字体变大,加粗,透明度
  3. CTR预估的几种方式
  4. 设计模式-牛刀小试01
  5. git 怎么切换分支命令_如何在Git中切换分支
  6. 2022-2028全球与中国3D制图系统市场现状及未来发展趋势
  7. 微信hook,企微hook功能演示。
  8. 解决了基于Android系统下的藏文输入重叠字的问题。
  9. vr体验馆加盟实力比概念重要
  10. 【Python函数的递归】