区间和问题——离散化
原题链接:活动 - 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;
}
区间和问题——离散化相关推荐
- 802. 区间和(离散化)
题目描述 假定有一个无限长的数轴,数轴上每个坐标上的数都是0. 现在,我们首先进行 n 次操作,每次操作将某一位置x上的数加c. 近下来,进行 m 次询问,每个询问包含两个整数l和r,你需要求出在区间 ...
- 【HDU - 4509】湫湫系列故事——减肥记II(合并区间模板 or 离散化标记 or 线段树)
题干: 虽然制定了减肥食谱,但是湫湫显然克制不住吃货的本能,根本没有按照食谱行动! 于是,结果显而易见- 但是没有什么能难倒高智商美女湫湫的,她决定另寻对策--吃没关系,咱吃进去再运动运动消耗掉不 ...
- CodeForces - 1285E Delete a Segmen(线段树+区间合并+离散化)
题目链接:点击查看 题目大意:给出n个线段代表集合,现在问若可以将其中任意一个线段删除,则能够形成最多多少个独立的集合(取并集后) 题目分析:看到区间不难想到线段树了,虽然这个题也可以用stl贪心做, ...
- POJ Mayor's posters——线段树+离散化
原文:http://blog.163.com/cuiqiongjie@126/blog/static/85642734201261151553308/ 大致题意: 有一面墙,被等分为1QW份,一份的宽 ...
- 连续特征离散化--汇总
说明:本文内容来自网络,此处仅是简单汇总 内容一 来源:https://www.cnblogs.com/-Sai-/p/6707327.html 在工业界,很少直接将连续值作为逻辑回归模型的特征输入, ...
- CART与ID3的区别C4.5离散化的过程
一.CART与ID3的区别 通过之前的研究发现,CART与ID3算法都是基于信息论的决策树算法,CART算法是一种通过计算Diversity(整体)-diversity(左节点)-diversity( ...
- python 离散化_数据离散化与Python实现
一.原理 数据离散化(也称,数据分组),指将连续的数据进行分组,使其变为一段离散化的区间. 根据离散化过程中是否考虑类别属性,可以将离散化算法分为:有监督算法和无监督算法.事实证明,由于有监督算法充分 ...
- 数据预处理Part4——数据离散化
文章目录 离散化,对数据做逻辑分层 1. 什么是数据离散化? 2. 为什么要将数据离散化 3. 如何将数据离散化? 3.1 时间数据离散化 3.2 多值离散数据离散化 3.3 连续数据离散化 3.4 ...
- 数据离散化与Python实现
一.原理 数据离散化(也称,数据分组),指将连续的数据进行分组,使其变为一段离散化的区间. 根据离散化过程中是否考虑类别属性,可以将离散化算法分为:有监督算法和无监督算法.事实证明,由 ...
最新文章
- 同步和串行的区别_[深度思考]·为什么CNN是同步(并行)而RNN是异步(串行)的呢?...
- PLMN概念和应用设置
- 第五节 19可空数据类型
- controller层没反应_埋地管道防腐层探测检漏仪FJ-10地下管线探测仪的说明及应用...
- Python树莓派编程1.2 探索树莓派
- 使用Java 8 Lambda清理JUnit Throwable-Tests
- QString与char *之间的转换
- Android之TextView属性详解
- 线程间通讯《代码》pthread_cond_wait/signal
- java打印空心金字塔
- hadoop yarn 获取日志_「大数据」「Hadoop」-安装及数据目录
- struts 2 时间控件
- JZ3-从尾到头打印链表
- TTL转USB TTL 232 CH340
- 固态硬盘比机械硬盘到底快多少呢
- 教你如何安装字体包 ——思源免费商用字体
- 【你好,windows】win10 1709 X86X64(16299.1029)专业纯净版2021.4.10
- 微信白名单服务器ip地址,微信服务器白名单IP列表
- MySQL中varchar最大长度是多少(真正的官网解释,事实说话)
- cv2.putText()函数中各个参数含义