AcWing 刷题日记——802. 区间和

简介: AcWing802题区间和

题目描述:

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

现在,我们首先进行 n 次操作,每次操作将某一位置 x上的数加 c

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

输入描述:

第一行包含两个整数 nm

接下来 n行,每行包含两个整数 xc

再接下来 m 行,每行包含两个整数 lr

输出描述:

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

数据范围:

-10^9<=x<=10^9,

1<=n ,m <= 10^5,

-10^9<=l<=r<=10^9

10000c10000

大体思路

首先看到了求区间内的和,那就可以利用前缀和来求,在看看其他描述,无限长的数轴,但是给出了n和m的范围,所以这个数组是有最多存放的大小的,只能放这么多数,但是x的范围是远大于我们求出来的数组上限大小的,就可以利用离散化来讲数组内的元素映射到一个容器当中,那这个题的大概思路就是用离散化加前缀和来求,对于数据来说,因为有成对出现的数据,所以我们可以使用pair来存放,可以定义两个pair类型的容器,一个用于存放x和c,一个用于存放l和r,废话不多说,上代码(带注释):

#include<iostream>#include<vector>#include<algorithm>usingnamespacestd;
constintN=300010;//题目上能用到最大多的数就是2n+m,n和m都是10^5intn, m;
inta[N], s[N];//a是原数组,s是前缀和vector<int>alls;//alls用于对a数组内的元素进行映射,离散化操作vector<pair<int, int>>add, qu;//add用于在哪个点加多少,qu存放的是区间,l和r,所以两个都用pair存放intfind(intx)
{
//利用二分查找到x在哪intl=0, r=alls.size() -1;
while(l<r)
    {
intmid=l+r>>1;
if (alls[mid] >=x)r=mid;
elsel=mid+1;
    }
returnr+1;//这里返回r+1是因为后面要使用前缀和,r+1可以让前缀和不考虑边界问题}
intmain()
{
cin>>n>>m;
for (inti=0; i<n; i++)
    {
intx, c;
cin>>x>>c;
add.push_back({ x,c });//add存放在哪个点加多少,点是x,c是加多少alls.push_back(x);//讲要加的点映射到vector容器当中    }
for (inti=0; i<m; i++)
    {
intl, r;
cin>>l>>r;
qu.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());//利用unique函数进行去重//unique会将内部元素的重复元素全都放到后面,然后返回后面全是重复元素区间开始的第一位迭代器,再利用erase删除掉这些重复元素//查找到x的位置,并且加上我们要加的数for (autoitme : add)
    {
intx=find(itme.first);//查找到x的位置a[x] +=itme.second;//加上要加的值    }
//计算出前缀和for (inti=1; i<=alls.size(); i++)s[i] =s[i-1] +a[i];
//利用qu内部存放的端点,用前缀和相减得到答案for (autoitme : qu)
    {
intl=find(itme.first), r=find(itme.second);
cout<<s[r] -s[l-1] <<endl;
    }
return0;
}
相关文章
|
存储 分布式计算 Hadoop
HadoopCPU、内存、存储限制
【7月更文挑战第13天】
783 14
|
JSON 搜索推荐 C++
vscode如何更改背景颜色主题,黑色或白色?
【11月更文挑战第16天】在 VS Code 中更改背景颜色主题,可通过三种方式实现:1) 使用快捷键 Ctrl+K 和 Ctrl+T(Mac 上为 Command+K 和 Command+T)选择主题;2) 通过菜单中的“管理”-&gt;“颜色主题”选项选择;3) 修改 settings.json 文件中的 &quot;workbench.colorTheme&quot; 属性。此外,用户还可从扩展市场安装更多主题以满足个性化需求。
25172 6
|
缓存
npm install 安装依赖报错解决
npm install 安装依赖报错解决
487 0
|
前端开发 IDE JavaScript
【inBuilder 低代码开发实验室】使用inbuilder完成UBML低代码设计开发
【inBuilder 低代码开发实验室】使用inbuilder完成UBML低代码设计开发
311 0
|
弹性计算 Java 大数据
ECS使用体验
ECS使用体验
|
存储 算法 Java
浅谈HashMap,探索JDK(集合框架)
HashMap 是 JAVA 集合框架的成员。基于 [ 数组 + 链表 ] 的数据结构存储 key-value 形式的数据。key 是每条数据的唯一标识,HashMap 通过一个 hash 算法(也称散列算法)根据 key 值计算出这条数据在数组中的位置,即数组下标,然后把数据装载到一个链表元素 Node 中,最后根据数组下标进行落桶(bucket)操作。
2419 0
|
3天前
|
数据采集 人工智能 安全
|
13天前
|
云安全 监控 安全
|
4天前
|
自然语言处理 API
万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
1085 152