2022-11-07 Acwing每日一题
本系列所有题目均为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获得查询区间的端点l和r,利用前缀和公式即可得到这一段区间所有经过操作的数字之和。
代码实现
#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每日一题的更多相关文章
- 2018.11.07 bzoj2751: [HAOI2012]容易题(easy)(组合数学)
		传送门 组合数学一眼题. 感觉一直做这种题智商会降低. 利用组合数学的分步计数原理. 只用关心每个数不被限制的取值的总和然后乘起来就可以了. 对于大部分数都不会被限制,总和都是n(n+1)2\frac ... 
- 11.07图论水题Test
		11.07图论水题Test 题目 描述 做法 \(BSOJ6378\) 在\(i\)位置可以到\(i+a_i\)或\(i+b_i\)求\(1\rightarrow n\)字典序最小路径 判可达性后贪心 ... 
- CISP/CISA 每日一题 11
		CISA 每日一题(答) 一个合理建造的数据仓库应当支持下列三种基本的查询格式: 1.向上溯源和向下溯源——向上溯源是对数据进行总计:向下溯源是将数据进行细化: 2.交叉溯源——通过通用属性访问数据仓 ... 
- 老男孩IT教育-每日一题汇总
		老男孩IT教育-每日一题汇总 第几天 第几周 日期 快速访问链接 第123天 第二十五周 2017年8月25日 出现Swap file….already exists以下错误如何解决? 第122天 2 ... 
- CISP/CISA 每日一题 五
		CISA 每日一题(答) 信息系统审计师要确认系统变更程序中的: 1.变更需求应有授权.优先排序及跟踪机制: 2.日常工作手册中,明确指出紧急变更程序: 3.变更控制程序应同时为用户及项目开发组认可: ... 
- [每日一题]ES6中为什么要使用Symbol?
		关注「松宝写代码」,精选好文,每日面试题 加入我们一起学习,day day up 作者:saucxs | songEagle 来源:原创 一.前言 2020.12.23日刚立的flag,每日一题,题目 ... 
- [每日一题]面试官问:谈谈你对ES6的proxy的理解?
		[每日一题]面试官问:谈谈你对ES6的proxy的理解? 关注「松宝写代码」,精选好文,每日一题 作者:saucxs | songEagle 一.前言 2020.12.23 日刚立的 flag,每日一 ... 
- 【js】Leetcode每日一题-完成所有工作的最短时间
		[js]Leetcode每日一题-完成所有工作的最短时间 [题目描述] 给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i 项工作要花费的时间. 请你将这些工作分配给 k 位工人.所有工 ... 
- 【JavaScript】Leetcode每日一题-青蛙过河
		[JavaScript]Leetcode每日一题-青蛙过河 [题目描述] 一只青蛙想要过河. 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有). 青蛙可以跳上石子 ... 
- 【JavaScript】Leetcode每日一题-平方数之和
		[JavaScript]Leetcode每日一题-平方数之和 [题目描述] 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c . 示例1: 输入:c = 5 ... 
随机推荐
- Android下的Drawable使用
			Drawable表示一种可绘制的内容,可以由图片或者颜色组成.Android下的Drawable有BitmapDrawable.GradientDrawable.LayerDrawable等等 1.B ... 
- Linux之LVM逻辑卷管理
			LVM逻辑卷管理 LVM机制:PV物理卷,VG卷组,LV逻辑卷. --功能-- --物理卷管理-- --卷组管理-- --逻辑卷管理-- create(建立) pvcreate vgcreate lv ... 
- centos7使用tar包安装mysql5.7
			特别注意: 文档中涉及到密码的都是用的是弱密码,是存在安全风险的,一定要根据自己的情况修改为复杂度更高的密码! centos 7.6 mysql 5.7.31 基础目录: /srv/{app,data ... 
- KingbaseES 归档日志清理
			WAL是Write Ahead Log的简写,和Oracle的redo日志类似,在R3版本存放在data/sys_log中,R6版本以后在data/sys_wal目录,在数据库访问过程中,任何对数据块 ... 
- Group 和 Distinct 列的次序影响查询性能
			目录 一.概述 二.work_mem 满足排序情况 1.Distinct 语句 2.Group by 语句 三.work_mem 不满足排序情况 1.Distinct 语句 2.Group by 语句 ... 
- 用【Unity】中的【3D Object】画【数学函数】图形  ——  正弦函数... { }
			效果 场景搭建 创建一个空物体,并将其命名为 "GameManager",并[Reset]它 创建一个 "Sphere",并将其[Scale]设置为(0.1,0 ... 
- PPR管的熔接
			1. 热熔器的介绍 2. 用热熔器熔接PPR管 
- CentOS yum如何安装php7.4
			centos系统下使用yum安装php7.4正式版,当前基于WLNMP提供的一键安装包来安装 1.添加epel源 yum install epel-release 2.添加WLNMP一键安装包源 rp ... 
- 监控elasticsearch
			转载自:https://cloud.tencent.com/developer/article/1655489 注意:上半截跟下半截是采用的不同的方式,建议采用下半截的方式,上半截的方式据说获取不到数 ... 
- SpringBoot 项目部署 (配置文件分离)
			1. SpringBoot 配置文件加载 SpringBoot 加载配置文件的优先级如下: 当前目录下的config 子目录: 当前目录: classpath下的config文件夹: classpat ... 
