本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我会认真改正的。同时也希望文章能够让你有所收获,与君共勉!

今天来复习离散化的操作.

区间和

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

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

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

输入格式

第一行包含两个整数 n 和 m。

接下来 n 行,每行包含两个整数 x 和 c。

再接下来 m 行,每行包含两个整数 l 和 r。

输出格式

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

数据范围

−109≤x≤109,

1≤n,m≤105,

−109≤l≤r≤109,

−10000≤c≤10000

输入样例:

3 3

1 2

3 6

7 5

1 3

4 6

7 8

输出样例:

8

0

5

算法原理

离散化是建立了自然数到一段数列的映射(value->key),如将x,l,r都放进alls这个数组里,实现了数轴离散化成区间,重新建立了新的区间范围,从而能在更小的区间范围里去进行其他操作。

第一步是去重。将重复出现的地址数去除掉,并且进行排序(为了后面好二分)。

第二步是处理插入,即在alls中找到要进行操作的位置x,返回其在alls中的位置作为数组a的键key,并添加对应的值c(value)。

第三步就是获得离散化后的数列a的前缀和s

最后一步就是根据query获得查询区间的端点lr,利用前缀和公式即可得到这一段区间所有经过操作的数字之和。

代码实现

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef pair<int,int> PII;
vector<PII> add,query;
vector<int> alls; // 存储所有的地址,不仅存储了增加操作的地址还由输出区间的地址,将无穷长的数轴给他分割成有限区间
int n,m;
int a[1000010],s[1000010]; // a数组是数轴离散化后的数组,对离散化后的数组求前缀和即可得到这一区间的和 int find(int x){
int l = 0,r = alls.size()-1; // alls中包含了需要操作的所有区间,因此搜索范围就是alls内存储的地址
while(l < r){
int mid = (l+r) >> 1;
if(alls[mid] >= x){
r = mid;
}
else{
l = mid+1;
}
}
return l + 1; // 因为考虑前缀和的边界,因此直接+1就不需要考虑这个了
} int main(){
cin >> n >> m; for(int i=0; i < n ; ++i){
int x,c;
cin >> x >> c; // 输入在x处的值增加c
add.push_back({x,c}); // 将这一对pair装进add中
alls.push_back(x); // 将x装进alls中
} for(int i=0; i<m ; i ++){
int l ,r;
cin >> l >> r; // 输入查询区间
query.push_back({l,r}); // 将区间pair放入query中
alls.push_back(l); // 再将其放入alls中
alls.push_back(r);
} sort(alls.begin(),alls.end()); // 将地址进行排序
alls.erase(unique(alls.begin(),alls.end()),alls.end()); // 去掉重复的操作地址 for(auto item : add){ // 处理插入
int x = find(item.first);
a[x] += item.second; // a[x]连续的原因是因为alls中得下标是连续的,即使是插入也是在从0到alls.size()-1的区间内插入 }
// 区间求和
for(int i=1; i <= alls.size() ; ++ i){
s[i] = s[i-1] + a[i];
}
// 处理查询
for(auto item:query){
int l = find(item.first),r = find(item.second);
cout << s[r] - s[l-1] << endl;
}
return 0;
}

2022-11-07 Acwing每日一题的更多相关文章

  1. 2018.11.07 bzoj2751: [HAOI2012]容易题(easy)(组合数学)

    传送门 组合数学一眼题. 感觉一直做这种题智商会降低. 利用组合数学的分步计数原理. 只用关心每个数不被限制的取值的总和然后乘起来就可以了. 对于大部分数都不会被限制,总和都是n(n+1)2\frac ...

  2. 11.07图论水题Test

    11.07图论水题Test 题目 描述 做法 \(BSOJ6378\) 在\(i\)位置可以到\(i+a_i\)或\(i+b_i\)求\(1\rightarrow n\)字典序最小路径 判可达性后贪心 ...

  3. CISP/CISA 每日一题 11

    CISA 每日一题(答) 一个合理建造的数据仓库应当支持下列三种基本的查询格式: 1.向上溯源和向下溯源——向上溯源是对数据进行总计:向下溯源是将数据进行细化: 2.交叉溯源——通过通用属性访问数据仓 ...

  4. 老男孩IT教育-每日一题汇总

    老男孩IT教育-每日一题汇总 第几天 第几周 日期 快速访问链接 第123天 第二十五周 2017年8月25日 出现Swap file….already exists以下错误如何解决? 第122天 2 ...

  5. CISP/CISA 每日一题 五

    CISA 每日一题(答) 信息系统审计师要确认系统变更程序中的: 1.变更需求应有授权.优先排序及跟踪机制: 2.日常工作手册中,明确指出紧急变更程序: 3.变更控制程序应同时为用户及项目开发组认可: ...

  6. [每日一题]ES6中为什么要使用Symbol?

    关注「松宝写代码」,精选好文,每日面试题 加入我们一起学习,day day up 作者:saucxs | songEagle 来源:原创 一.前言 2020.12.23日刚立的flag,每日一题,题目 ...

  7. [每日一题]面试官问:谈谈你对ES6的proxy的理解?

    [每日一题]面试官问:谈谈你对ES6的proxy的理解? 关注「松宝写代码」,精选好文,每日一题 作者:saucxs | songEagle 一.前言 2020.12.23 日刚立的 flag,每日一 ...

  8. 【js】Leetcode每日一题-完成所有工作的最短时间

    [js]Leetcode每日一题-完成所有工作的最短时间 [题目描述] 给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i 项工作要花费的时间. 请你将这些工作分配给 k 位工人.所有工 ...

  9. 【JavaScript】Leetcode每日一题-青蛙过河

    [JavaScript]Leetcode每日一题-青蛙过河 [题目描述] 一只青蛙想要过河. 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有). 青蛙可以跳上石子 ...

  10. 【JavaScript】Leetcode每日一题-平方数之和

    [JavaScript]Leetcode每日一题-平方数之和 [题目描述] 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c . 示例1: 输入:c = 5 ...

随机推荐

  1. Android下的Drawable使用

    Drawable表示一种可绘制的内容,可以由图片或者颜色组成.Android下的Drawable有BitmapDrawable.GradientDrawable.LayerDrawable等等 1.B ...

  2. Linux之LVM逻辑卷管理

    LVM逻辑卷管理 LVM机制:PV物理卷,VG卷组,LV逻辑卷. --功能-- --物理卷管理-- --卷组管理-- --逻辑卷管理-- create(建立) pvcreate vgcreate lv ...

  3. centos7使用tar包安装mysql5.7

    特别注意: 文档中涉及到密码的都是用的是弱密码,是存在安全风险的,一定要根据自己的情况修改为复杂度更高的密码! centos 7.6 mysql 5.7.31 基础目录: /srv/{app,data ...

  4. KingbaseES 归档日志清理

    WAL是Write Ahead Log的简写,和Oracle的redo日志类似,在R3版本存放在data/sys_log中,R6版本以后在data/sys_wal目录,在数据库访问过程中,任何对数据块 ...

  5. Group 和 Distinct 列的次序影响查询性能

    目录 一.概述 二.work_mem 满足排序情况 1.Distinct 语句 2.Group by 语句 三.work_mem 不满足排序情况 1.Distinct 语句 2.Group by 语句 ...

  6. 用【Unity】中的【3D Object】画【数学函数】图形 —— 正弦函数... { }

    效果 场景搭建 创建一个空物体,并将其命名为 "GameManager",并[Reset]它 创建一个 "Sphere",并将其[Scale]设置为(0.1,0 ...

  7. PPR管的熔接

    1. 热熔器的介绍 2. 用热熔器熔接PPR管

  8. CentOS yum如何安装php7.4

    centos系统下使用yum安装php7.4正式版,当前基于WLNMP提供的一键安装包来安装 1.添加epel源 yum install epel-release 2.添加WLNMP一键安装包源 rp ...

  9. 监控elasticsearch

    转载自:https://cloud.tencent.com/developer/article/1655489 注意:上半截跟下半截是采用的不同的方式,建议采用下半截的方式,上半截的方式据说获取不到数 ...

  10. SpringBoot 项目部署 (配置文件分离)

    1. SpringBoot 配置文件加载 SpringBoot 加载配置文件的优先级如下: 当前目录下的config 子目录: 当前目录: classpath下的config文件夹: classpat ...