洛谷 P3372:线段树 1 ← 分块算法模板(区间更新、区间查询)

【题目来源】
https://www.luogu.com.cn/problem/P3372

【题目描述】
如题,已知一个数列,你需要进行下面两种操作:
(1)将某区间每一个数加上 k。
(2)求出某区间每一个数的和。

【输入格式】
第一行包含两个整数 n,m,分别表示该数列数字的个数和操作的总个数。
第二行包含 n 个用空格分隔的整数,其中第 i 个数字表示数列第 i 项的初始值。
接下来 m 行每行包含 3 或 4 个整数,表示一个操作,具体如下:
1 x y k:将区间 [x,y] 内每个数加上 k。
2 x y:输出区间 [x,y] 内每个数的和。

【输出格式】
输出包含若干行整数,即为所有操作 2 的结果。

【输入样例】
5 5
1 5 4 2 3
2 2 4
1 2 3 2
2 3 4
1 1 5 1
2 1 4​​​​​​​

【输出样例】
11
8
20

【说明/提示】
对于 30% 的数据:n≤8,m≤10。
对于 70% 的数据:n≤10^3,m≤10^4。
对于 100% 的数据:1≤n,m≤10^5。
保证任意时刻数列中所有元素的绝对值之和 ≤10^18。

【算法分析】
● 本题其实就是
线段树的模板题,这里用来练习分块
● 分块是用线段树的分区思想改良的暴力法。代码比线段树简单。效率比普通暴力法高。分块适合求解 m=n=
10^5 规模的问题。或 m*sqrt(n)≈10^7 的问题。其中,n 为元素个数,m 为操作次数。
● 分块操作的基本要素
(1)块的大小用 block 表示。通常,令
block=sqrt(n)。其中,n 为元素个数。
(2)块的数量用 cnt 表示。其计算公式为
cnt=(n+block-1)/block。或者,用如下更易理解的代码计算 cnt 的值。即:

int block=sqrt(n);
int cnt=n/block;
if(n % block) cnt++;

(3)块的左边界 le[] 及右边界 ri[]。
用 le[i] 和 ri[i] 分别表示块 i 的第一个和最后一个元素的位置。则有:
le[1]=1, ri[1]=block;
le[2]=block+1, ri[2]=2*block;
……
le[i]=(i-1)*block+1, ri[i]=i*block;
……

(4)定义 pos[i] 为第 i 个元素所在的块:pos[i]=(i-1)/block+1。其中,block=sqrt(n)。
(5)定义 sum[i] 为第 i 块的区间和。

for(int i=1; i<=n; i++) sum[pos[i]]+=a[i];

(6)定义 add[i] 为第 i 块的增量,初始值为 0。
一般情况下,区间 [L,R] 跨越了多个块。
在被 [L,R] 完全包含的整块内,更新
add[i]=add[i]+d;
位于整块两头,不能被 [L,R] 完全包含的两个碎块,分别更新
sum(p)=sum(p)+(ri[p]-L+1)*dsum(q)=sum(q)+(R-le[q]+1)*d


【算法代码】

#include <bits/stdc++.h>
using namespace std;typedef long long LL;
const int maxn=1e5+5;LL a[maxn];
LL le[maxn],ri[maxn],pos[maxn];
LL sum[maxn],add[maxn];
int cnt;void build(int n) {int block=sqrt(n);int cnt=n/block;if(n%block) cnt++;for(int i=1; i<=cnt; i++) {le[i]=(i-1)*block+1;ri[i]=i*block;}ri[cnt]=n;for(int i=1; i<=n; i++) pos[i]=(i-1)/block+1;for(int i=1; i<=n; i++) sum[pos[i]]+=a[i];
}void update(int L,int R,int d) { //section updateint p=pos[L],q=pos[R];if(p==q) {for(int i=L; i<=R; i++) a[i]+=d;sum[p]+=(R-L+1)*d;} else {for(int i=p+1; i<=q-1; i++) add[i]+=d;for(int i=L; i<=ri[p]; i++) a[i]+=d;sum[p]+=(ri[p]-L+1)*d;for(int i=le[q]; i<=R; i++) a[i]+=d;sum[q]+=(R-le[q]+1)*d;}
}LL query(int L,int R) { //LLint p=pos[L],q=pos[R];LL ans=0; //LLif(p==q) {for(int i=L; i<=R; i++) ans+=a[i];ans+=add[p]*(R-L+1);} else {for(int i=p+1; i<=q-1; i++) ans+=sum[i]+add[i]*(ri[i]-le[i]+1);for(int i=L; i<=ri[p]; i++) ans+=a[i];ans+=add[p]*(ri[p]-L+1);for(int i=le[q]; i<=R; i++) ans+=a[i];ans+=add[q]*(R-le[q]+1);}return ans;
}int main() {int n,m;cin>>n>>m;for(int i=1; i<=n; i++) cin>>a[i];build(n);while(m--) {int op,a,b,c;cin>>op>>a>>b;if(op==1) {cin>>c;update(a,b,c);} else cout<<query(a,b)<<endl;}return 0;
}/*
in:
5 5
1 5 4 2 3
2 2 4
1 2 3 2
2 3 4
1 1 5 1
2 1 4out:
11
8
20
*/




【参考文献】
https://blog.csdn.net/m0_52398496/article/details/123233908
https://blog.csdn.net/weixin_45539557/article/details/116461380
https://blog.csdn.net/wzh1378008099/article/details/89243459




 

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

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

相关文章

JavaScript进阶——05-迭代器和生成器【万字长文,感谢支持】

迭代器 概念 迭代器&#xff08;Iterator&#xff09;是 JavaScript 中一种特殊的对象&#xff0c;它提供了一种统一的、通用的方式遍历个各种不同类型的数据结构。可以遍历的数据结构包括&#xff1a;数组、字符串、Set、Map 等可迭代对象。我们也可以自定义实现迭代器&…

Python爬虫——如何使用urllib的HTTP基本库

怎样通过 urllib库 发送 HTTP 请求&#xff1f; urllib库主要由四个模块组成: urllib.request 打开和读取 URLurllib.error 包含 urllib.request 抛出的异常urllib.parse 用于解析 URLurllib.robotparser 用于解析 robots.txt 文件 1. 使用urllib.parse解析URL 使用urlparse(…

Linux连接文件那点事

什么是连接文件 将一个文件和另一个文件建立联系&#xff0c;分为硬链接和软连接&#xff08;符号连接&#xff09;。 硬链接 Linux中&#xff0c;所有的文件都有一个inode&#xff0c;这个东西就是文件的ID号&#xff0c;硬链接的方式就是通过这个inode来产生新的文件名来建…

【动态规划】:路径问题_地下城游戏

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本专栏是关于各种算法的解析&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数据结构专栏&…

Metes and Bounds Pro for Mac 激活版:精准数据转换与绘图利器

Metes and Bounds Pro for Mac是一款专为土地测量和边界划定而设计的专业软件&#xff0c;为Mac用户提供了高效、精确的测量工具。其核心功能在于其全面的测量工具和简便的操作流程&#xff0c;能够满足在土地管理、房地产开发、农业规划等领域的多样化需求。 这款软件集合了距…

语义分割——高分卫星土地覆盖数据集

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …

C++ QT设计模式 (第二版)

第3章 Qt简介 3.2 Qt核心模块 Qt是一个大库&#xff0c;由数个较小的库或者模块组成&#xff0c;最为常见的如下&#xff1a;core、gui、xml、sql、phonon、webkit&#xff0c;除了core和gui&#xff0c;这些模块都需要在qmake的工程文件中启用 QTextStream 流&#xff0c;Qdat…

2万字实操入门案例之在Springboot框架下用Mybatis简化JDBC开发实现基础的操作MySQL之预编译SQL主键返回增删改查

环境准备 准备数据库表 use mybatis;-- 部门管理 create table dept(id int unsigned primary key auto_increment comment 主键ID,name varchar(10) not null unique comment 部门名称,create_time datetime not null comment 创建时间,update_time datetime not null comme…

Naive RAG 、Advanced RAG 和 Modular RAG 简介

简介&#xff1a; RAG&#xff08;Retrieval-Augmented Generation&#xff09;系统是一种结合了检索&#xff08;Retrieval&#xff09;和生成&#xff08;Generation&#xff09;的机制&#xff0c;用于提高大型语言模型&#xff08;LLMs&#xff09;在特定任务上的表现。随…

EEL中 python端的函数名是如何传递给js端的

python端的函数名是如何传递给js端的 核心步骤&#xff1a;将函数名列表注入到动态生成的 eel.js 中&#xff0c;这样前端一开始引用的eel.js本身已经包含有py_function的函数名列表了。你打开开发者工具看看浏览器中的 eel.js文件源代码就知道了。 具体实现&#xff1a; # 读…

启明智显分享|国产RISC-V@480MHz“邮票孔”工业级HMI核心板,高品质低成本,仅34.9元!

「Model系列」芯片是启明智显针对工业、行业以及车载产品市场推出的系列HMI芯片&#xff0c;主要应用于工业自动化、智能终端HMI、车载仪表盘、串口屏、智能中控、智能家居、充电桩显示屏、储能显示屏、工业触摸屏等领域。此系列具有高性能、低成本的特点&#xff0c;支持工业宽…

Transformers实战01-开箱即用的 pipelines

文章目录 简介安装pipelines图片转文本文本生成情感分析零训练样本分类遮盖词填充命名实体识别自动问答自动摘要 pipeline 背后做了什么&#xff1f;使用分词器进行预处理将预处理好的输入送入模型对模型输出进行后处理 简介 Transformers 是由 Hugging Face 开发的一个 NLP 包…

读人工智能时代与人类未来笔记03_演变

1. 演变 1.1. 每个社会都找到了属于自己的一套适应世界的方法 1.1.1. 适应的核心&#xff0c;是有关人类心智与现实之间关系的概念 1.1.2. 人类认识周围环境的能力 1.1.2.1. 这种能力通过知识获得&#xff0c;同时也受到知识…

奥维地图下载高清影像的两种方式!以及ArcGIS、QGIS、GlobalMapper、自编工具下载高清影像的方法推荐!

今天来介绍一下奥维互动地图是如何下载高清影像的&#xff0c;也不是多了不起的功能&#xff01;有朋友问&#xff0c;加上这个软件确实用的人多。 下载的高清数据在ArcGIS中打开的效果&#xff01; 开始介绍奥维之前我们也介绍一下我们之前介绍的几个方法&#xff0c;没有优劣…

【提示学习论文】TCP:Textual-based Class-aware Prompt tuning for Visual-Language Model

TCP:Textual-based Class-aware Prompt tuning for Visual-Language Model&#xff08;CVPR2024&#xff09; 基于文本的类感知提示调优的VLMKgCoOp为baseline&#xff0c;进行改进&#xff0c;把 w c l i p w_{clip} wclip​进行投影&#xff0c;然后与Learnable prompts进行…

您可以使用WordPress创建的19种网站类型

当人们决定为什么他们应该使用WordPress时&#xff0c;我们经常会被问到“WordPress可以做[空白]吗&#xff1f;答案大多是肯定的。在本文中&#xff0c;我们将向您展示您可以使用WordPress创建的19种不同类型的网站&#xff0c;而无需学习任何编程技巧。 目录 隐藏 1 开始使用…

html--地图

<!DOCTYPE html> <html lang"en"> <head><meta charset"utf-8"><title>ECharts</title><!--Step:1 引入一个模块加载器&#xff0c;如esl.js或者require.js--><script src"js/esl.js"></scr…

SpringBoot项目的项目部署全过程

一、前端 安装nginx 1.将提前准备好的nginx的安装包上传到Linux中/opt目录下(我用的是Xftp) 2.解压 2.1:在xshell中解压该文件: tar -zxvf nginx-1.20.1.tar.gz 2.2:进入解压后的目录 cd nginx-1.20.1/ 2.3:安装需要的依赖 yum -y install zlib zlib-devel openssl openssl-de…

【Doris的安装与部署】

1 集群规划和环境准备 Doris作为一款MPP架构的OLAP数据库&#xff0c;可以在绝大多数主流的商用服务器上运行。 1.1 环境要求 一般推荐使用Linux系统&#xff0c;版本要求是CentOS 7.1及以上或者Ubuntu 16.04及以上&#xff0c;这也是目前服务器市场最主流的操作系统。 操作…

在 CSS 中使用 text-emphasis 来增强文本的趣味性

在CSS中设置文本样式的方法有很多。您可以更改颜色、大小、字体&#xff0c;甚至添加阴影和轮廓等效果。但最近&#xff0c;我了解到一个我以前没有听说过的时尚 CSS 属性&#xff0c;它非常棒&#xff01; 它被称为文本强调&#xff08;text-emphasis&#xff09;&#xff0c…