AcWing 802. 区间和

在这里插入图片描述

var说明
add存储了插入操作,在指定 x x x下标所在位置 a [ x ] + = c a[x]+=c a[x]+=c
query是求 [ L , R ] [L,R] [L,R]区间和用到的数组,最后才用到
alls 是存储离散化之后的值 , 对于会访问到的每个下标,统统丢到 a l l s 里面 ,会把 x 和 [ L , R ] 都丢到 a l l s 里面,不同的 [ L , R ] 有可能会重复输入, 比如询问 [ 4 , 6 ] , [ 4 , 9 ] 的区间和 , 因此有必要去重,调用 a l l s . e r a s e 是存储离散化之后的值,对于会访问到的每个下标,统统丢到alls里面 \\ ,会把x和[L,R]都丢到alls里面,不同的[L,R]有可能会重复输入,\\ 比如询问[4,6],[4,9]的区间和,因此有必要去重,调用alls.erase 是存储离散化之后的值,对于会访问到的每个下标,统统丢到alls里面,会把x[L,R]都丢到alls里面,不同的[L,R]有可能会重复输入,比如询问[4,6],[4,9]的区间和,因此有必要去重,调用alls.erase
find 在 a l l s 里面二分查找 返回 r + 1 是想要做前缀和,下标要从 1 开始算,直接 r e t u r n r 会把下标从 0 开始算 r e t u r n r + 1 就是 r ≥ 0 , f i n d 返回值是 ≥ 1 , 返回值从 1 开始算 在alls里面二分查找\\返回r+1是想要做前缀和,下标要从1开始算,直接return \,\,\,\, r会把下标从0开始算\\return \,\,\,r+1就是r\ge0,find返回值是\ge1,返回值从1开始算 alls里面二分查找返回r+1是想要做前缀和,下标要从1开始算,直接returnr会把下标从0开始算returnr+1就是r0,find返回值是1,返回值从1开始算

思路:
把不同的 ∀ i ∈ [ 0 , m − 1 ] 把 [ L , R ] i \forall i\in [0,m-1]把[L,R]_i i[0,m1][L,R]i区间输入到 q u e r y query query

把不同的 ∀ i ∈ [ 0 , n − 1 ] 把 { x , c } i \forall i\in [0,n-1]把\{x,c\}_i i[0,n1]{x,c}i输入到 a d d add add

把不同的 ∀ i ∈ [ − inf ⁡ , inf ⁡ ] 把会访问到的坐标轴的下标位置 i d x i \forall i\in [-\inf,\inf]把会访问到的坐标轴的下标位置idx_i i[inf,inf]把会访问到的坐标轴的下标位置idxi输入到 a l l s alls alls,
i d x i 来自于 [ L , R ] i 的 L 和 R 还有 { x , c } i 里面的 x idx_i来自于[L,R]_i的L和R还有\{x,c\}_i里面的x idxi来自于[L,R]iLR还有{x,c}i里面的x,就这三个来源

1.应用离散化的方法初始化query,add和alls
2. a 在 x 位置加上 c ,先把 x 位置通过 f i n d 函数得到离散化之后的坐标 i d x ,然后 a [ i d x ] + = c , 完成 + = c a在x位置加上c,先把x位置通过find函数得到离散化之后的坐标idx,然后a[idx]+=c,完成+=c ax位置加上c,先把x位置通过find函数得到离散化之后的坐标idx,然后a[idx]+=c,完成+=c
3. 对 a 求前缀和存到 b 里面 对a求前缀和存到b里面 a求前缀和存到b里面
4. 遍历 q u e r y , 对于每个 p a i r < i n t , i n t > 类型的 [ L , R ] i , 我们也是要先分别通过 f i n d 函数分别获取 L , R 在离散化之后的下标 然后根据离散化之后建立的前缀和数组 b ,来直接求区间和! 遍历query,\\对于每个pair<int,int> 类型的[L,R]_i,我们也是要先分别通过find函数分别获取L,R在离散化之后的下标\\然后根据离散化之后建立的前缀和数组b,来直接求区间和! 遍历query对于每个pair<int,int>类型的[L,R]i,我们也是要先分别通过find函数分别获取LR在离散化之后的下标然后根据离散化之后建立的前缀和数组b,来直接求区间和!
总结:
题目要求区间和,然后可以用前缀和解决问题,但是这个问题是如果直接开辟一个巨大的数组然后在许多是0的位置反复计算+=0会很费劲,然后可以用离散化的方法减少计算量,只在需要访问的下标位置+=c,减少计算量,降低时间复杂度。
时间复杂度分析:
vector.erase的复杂度是 O ( k ) , k 是重复的元素 O(k),k是重复的元素 O(k)k是重复的元素
二分查找是 O ( l o g n ) O(logn) O(logn)
排序是 O ( n l o g n ) O(nlogn) O(nlogn)
然后求前缀和是 O ( n ) O(n) O(n)
总得来说是 O ( n l o g n ) + O ( k ) = O ( n l o g n ) O(nlogn) +O(k)=O(nlogn) O(nlogn)+O(k)=O(nlogn)

#include<algorithm>
#include<iostream>
#define N 300086
using namespace std;
int n,m,x,a[N],b[N];
typedef pair<int,int> PII;
vector<PII> add,query;
vector<int> alls;
//在alls里面二分查找
//返回r+1是想要做前缀和,下标要从1开始算,直接return r会把下标从0开始算
//return r+1就是r≥0,find返回值是≥1,返回值从1开始算
int find(int x){int l=0,r=alls.size()-1;while(l<r){int mid=l+r>>1;if(alls[mid]>=x) r=mid;else l=mid+1;}return r+1;
}
int main(){cin>>n>>m;for(int i=0;i<n;++i){int x,c;cin>>x>>c;add.push_back({x,c});alls.push_back(x);}for(int i=0;i<m;++i){int l,r,c;cin>>l>>r;query.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());for(auto item:add){int idx=find(item.first);a[idx]+=item.second;}for(int i=1;i<=alls.size();++i){b[i]=b[i-1]+a[i];}for(const auto& item:query){int l=find(item.first),r=find(item.second);cout<<b[r]-b[l-1]<<endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/51225.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Golang 面试 - 基础题】每日 5 题(七)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

数据结构----算法复杂度

1.数据结构前言 数据是杂乱无章的&#xff0c;我们要借助结构将数据管理起来 1.1 数据结构 数据结构(Data Structure)是计算机存储、组织数据的⽅式&#xff0c;指相互之间存在⼀种或多种特定关系的数 据元素的集合。没有⼀种单⼀的数据结构对所有⽤途都有⽤&#xff0c;所…

查看路由表 netstat -r

“Kernel IP routing table” 是Linux系统中用于展示和配置IP路由的表。它告诉操作系统如何将数据包从一个网络接口发送到另一个网络或主机。下面是对您给出的路由表条目的解释&#xff1a; Destination&#xff1a;目的地地址&#xff0c;可以是具体的IP地址&#xff0c;也可…

ctfshow解题方法

171 172 爆库名->爆表名->爆字段名->爆字段值 -1 union select 1,database() ,3 -- //返回数据库名 -1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema库名 -- //获取数据库里的表名 -1 union select 1,group_concat(…

Python爬虫入门02:Fiddler下载使用教程

文章目录 手机抓包全攻略&#xff1a;Fiddler 工具深度解析引言Fiddler 工具简介为什么选择 Fiddler&#xff1f; 安装与配置 Fiddler步骤一&#xff1a;下载与安装步骤二&#xff1a;配置浏览器代理步骤三&#xff1a;安装 HTTPS 证书 配置手机以使用 Fiddler步骤一&#xff1…

操作系统面试知识点总结5

#来自ウルトラマンメビウス&#xff08;梦比优斯&#xff09; 1 IO管理概述 1.1 I/O 设备 I/O 设备的类型分类。 1.1.1 按使用特性 人机交互类外部设备&#xff0c;例如打印机、显示器等。存储设备&#xff0c;例如磁盘、光盘等。网络通信设备&#xff0c;例如网络接口等。 1…

【计算机网络】IP地址和子网掩码(IP地址篇)

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️计算机网络】 文章目录 前言IP地址网络地址网络地址的定义与组成作用分类网络地址的分配与管理 广播地址&#xff08;Broadcast Address&#xff09;定义构成类型作用注意事项 广播地址功能 组播地址…

HiveSQL题——炸裂+开窗

一、每个学科的成绩第一名是谁&#xff1f; 0 问题描述 基于学生成绩表输出每个科目的第一名是谁呢&#xff1f; 1 数据准备 with t1 as(selectzs as name,[{"Chinese":80},{"Math":70}],{"English"…

CompletableFuture使用详解

简单的任务&#xff0c;用Future获取结果还好&#xff0c;但我们并行提交的多个异步任务&#xff0c;往往并不是独立的&#xff0c;很多 时候业务逻辑处理存在串行[依赖]、并行、聚合的关系。如果要我们手动用 Future 实现&#xff0c;是非常麻烦的。 CompletableFutur…

JMeter基本使用

一、JMeter线程组相关 进程&#xff1a;正在运行的程序。线程&#xff1a;是进程中的执行线索。线程组&#xff1a;进程中有许多线程&#xff0c;为了方便管理&#xff0c;可以对线程按照性质分组&#xff0c;分组的结果就是线程组。PS&#xff1a;三者关系&#xff0c;一个进…

【设计模式】(万字总结)深入理解Java中的创建型设计模式

1. 前言 在软件开发的世界里&#xff0c;设计模式是一种被广泛接受并应用的解决方案。它们不仅仅是代码的设计&#xff0c;更是对问题的思考和解决的方法论。在Java开发中&#xff0c;特别是在面向对象的编程中&#xff0c;设计模式尤为重要。创建型设计模式&#xff0c;作为设…

【初阶数据结构篇】实现顺序结构二叉树(堆的实现方法)

文章目录 实现顺序结构二叉树&#xff08;堆&#xff09;前言代码位置堆的概念与结构概念 堆的实现堆初始化和销毁堆的插入堆的判空堆的删除数据取堆顶数据 实现顺序结构二叉树&#xff08;堆&#xff09; 前言 ​ ⼀般堆使⽤顺序结构的数组来存储数据&#xff0c;堆是⼀种特…

一键生成惊艳图像:使用Stable Diffusion打造惊人视觉效果

一、简介 Stable Diffusion是一种由Stability AI开发的生成式AI模型&#xff0c;能够将文本提示转换为高质量的图像。作为生成式扩散模型的一部分&#xff0c;Stable Diffusion通过解析和理解输入的文本提示&#xff0c;逐步生成与描述相匹配的图像。这一技术不仅在图像生成和…

MybatisPlus核心用法

MybatisPlus核心用法 目录 MybatisPlus核心用法1.使用MybatisPlus的基本步骤&#xff1a;2.MybatisPlus是如何获取实现CRUD的数据库表信息的&#xff1f;3.MybatisPlus的常用注解有哪些&#xff1f;如果表名称和实体类名称不符合约定该怎么做&#xff1f;IdType的常见类型有哪些…

漏洞复现-F6-11泛微-E-Cology-SQL

本文来自无问社区&#xff0c;更多漏洞信息可前往查看http://www.wwlib.cn/index.php/artread/artid/15575.html 0x01 产品简介 泛微协同管理应用平台e-cology是一套企业级大型协同管理平台 0x02 漏洞概述 该漏洞是由于泛微e-cology未对用户的输入进行有效的过滤&#xff0…

Skyeye云智能制造企业版源代码全部开放

智能制造一体化管理系统 [SpringBoot2 - 快速开发平台]&#xff0c;适用于制造业、建筑业、汽车行业、互联网、教育、政府机关等机构的管理。包含文件在线操作、工作日志、多班次考勤、CRM、ERP 进销存、项目管理、EHR、拖拽式生成问卷、日程、笔记、工作计划、行政办公、薪资模…

vue3 快速入门 (六) : vue中调用HTTP请求

1. 本文环境 Vue版本 : 3.4.29Node.js版本 : v20.15.0系统 : Windows11 64位IDE : VsCode 1.91.0 2. 访问HTTP 在Vue中&#xff0c;访问HTTP&#xff0c;可以使用axios第三方库。 axios 是一个基于 promise 的网络请求库&#xff0c;可以用于浏览器和 node.js。 axios使用简…

遗传算法与深度学习实战——进化深度学习

遗传算法与深度学习实战——进化深度学习 0. 前言1. 进化深度学习1.1 进化深度学习简介1.2 进化计算简介 2. 进化深度学习应用场景3. 深度学习优化3.1 优化网络体系结构 4. 通过自动机器学习进行优化4.1 自动机器学习简介4.2 AutoML 工具 5. 进化深度学习应用5.1 模型选择&…

【mybatis的批量操作】

在日常开发中&#xff0c;如果要操作数据库的话&#xff0c;或多或少都会遇到批量数据的处理&#xff0c;我们公司使用的mybaits-plus作为持久层的框架&#xff0c;今天就简单介绍一下mybaits批量操作数据库的几种方式。 1.循环插入 其实这种方式并不是批量插入&#xff0c;只…

功能实现——使用 OpenPDF 将 HTML 转换为 PDF,并将其上传到 FTP 服务器

目录 1.需求分析2.项目环境搭建3.将 HTML 转换为 PDF3.1.代码实现mail.htmlHtmlToPDFController.javaPDFConverterService.javaPDFConverterServiceImpl.java 3.2.测试3.3.注意事项 4.将生成的 PDF 上传到 FTP 服务器4.1.搭建 FTP 服务器4.2.配置文件4.3.代码实现FtpUtil.javaF…