本系列所有题目均为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. Windows 系统 PostgreSQL 手工安装配置方法

    自从2020年底开始接触 PostgreSQL 以来就喜欢上了这个数据库,个人感觉比 MySQL 好用,多表联合查询性能好很多,同时也不存在 SQLServer 的版权授权费用问题.搭配 .NET 开 ...

  2. 大数据Hadoop平台安装及Linux操作系统环境配置

    配置 Linux 系统基础环境 查看服务器的IP地址 设置服务器的主机名称 hostnamectl set-hostname hadoop hostname可查看 绑定主机名与IP 地址 vim /e ...

  3. 如何查找并简单分析core文件

    当系统发生coredump时,通常需要通过分析core文件来定位问题所在,但实际工作中,有时却发现core 文件找不到,或者core文件被删除了. 一.core文件没有生成 KINGBASE core ...

  4. 使用Dockfile构建mysql镜像与初始化运行mysql容器

    使用docker 构建mysql镜像,并在容器初次创建时初始化数据 Dockerfile FROM mysql:5.7.23 MAINTAINER gradyjiang "jiangzhon ...

  5. day36-IO流03

    JavaIO流03 4.常用的类02 4.4节点流和处理流 4.4.1基本介绍 节点流可以从一个特定的数据源读写数据,如FileReader.FileWriter 数据源就是存放数据的地方,比如文件. ...

  6. LFS(Linux From Scratch)构建过程全记录(五):交叉工具链的构建

    写在前面 本文将详细讲述如何构建工具链 前置知识 在LFS-BOOK中,我们需要学习一些关于"交叉编译"的内容,详见书本 安装Binutils-2.39 我们cd到sources文 ...

  7. winfrom杀死进程及关闭进程

    ProcessStartInfo process = new ProcessStartInfo(); process.FileName = AppDomain.CurrentDomain.BaseDi ...

  8. JDK自带javap命令反编译class文件和Jad反编译class文件(推荐使用jad)

    一.前言 我们在日常学习中,对一个java代码有问题,不知道jvm内部怎么进行解析的时候:有个伟大壮举就是反编译,这样就可以看到jvm内部怎么进行对这个java文件解析的!我们可以使用JDK自带的ja ...

  9. docker垃圾处理

    1 查找docker文件夹 find / -name docker 2 列举文件夹大小 du -h --time --max-depth=1 . df -h df -TH 3 Docker占用磁盘空间 ...

  10. Git pull 强制拉取并覆盖本地代码

    git fetch --all git reset --hard origin/master git pull