P3372 【模板】线段树 1(内附封面)

news2024/10/5 13:55:27

【模板】线段树 1

题目描述

如题,已知一个数列,你需要进行下面两种操作:

  1. 将某区间每一个数加上 k k k
  2. 求出某区间每一个数的和。

输入格式

第一行包含两个整数 n , m n, m n,m,分别表示该数列数字的个数和操作的总个数。

第二行包含 n n n 个用空格分隔的整数,其中第 i i i 个数字表示数列第 i i i 项的初始值。

接下来 m m m 行每行包含 3 3 3 4 4 4 个整数,表示一个操作,具体如下:

  1. 1 x y k:将区间 [ x , y ] [x, y] [x,y] 内每个数加上 k k k
  2. 2 x y:输出区间 [ x , y ] [x, y] [x,y] 内每个数的和。

输出格式

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

样例 #1

样例输入 #1

5 5
1 5 4 2 3
2 2 4
1 2 3 2
2 3 4
1 1 5 1
2 1 4

样例输出 #1

11
8
20

提示

对于 30 % 30\% 30% 的数据: n ≤ 8 n \le 8 n8 m ≤ 10 m \le 10 m10
对于 70 % 70\% 70% 的数据: n ≤ 10 3 n \le {10}^3 n103 m ≤ 10 4 m \le {10}^4 m104
对于 100 % 100\% 100% 的数据: 1 ≤ n , m ≤ 10 5 1 \le n, m \le {10}^5 1n,m105

保证任意时刻数列中所有元素的绝对值之和 ≤ 10 18 \le {10}^{18} 1018

【样例解释】

模板题,思路不过多解释

线段树由很多部分共同实现,比如单点查询,单点修改,区间修改,区间查询等

  • 建树

首先,线段树是二叉树,因此具有二叉树的性质,其左儿子节点与右儿子节点是固定的,具体实现如下,其中, l c ( x ) lc(x) lc(x)为左儿子, r c ( x ) rc(x) rc(x)为右儿子

#define lc(x) (x<<1)
#define rc(x) ((x<<1)|1)

其次,线段树的建立为递归建立,最底层的节点对应的就是 a [ 1... n ] a[1...n] a[1...n]

void build(int x,int l,int r){
	tag[x]=0;
	if(l==r){
		sm[x]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(lc(x),l,mid);
	build(rc(x),mid+1,r);
	sm[x]=sm[lc(x)]+sm[rc(x)];
}

s m [ x ] = s m [ l c ( x ) ] + s m [ r c ( x ) ] sm[x]=sm[lc(x)]+sm[rc(x)] sm[x]=sm[lc(x)]+sm[rc(x)]通常会被单独写做一个函数pushup

区间修改与查询

单点修改与查询只需如同建树一样查找到节点修改并pushup或return即可,不过多赘述。

对于区间修改,我们需要用到 lazy_tag 对于一次修改操作我们先不全部进行修改,当火烧眉毛不得不用到这个值时再进行修改,使用一个tag[]数组实现

void cover(int x,int l,int r,int d){//打上tag
	sm[x]+=(r-l+1)*d;
	tag[x]+=d;
}
void pushdown(int x,int l,int r){//tag下传
	if(tag[x]){
		int mid=(l+r)>>1;
		cover(lc(x),l,mid,tag[x]);
		cover(rc(x),mid+1,r,tag[x]);
		tag[x]=0;
	}
}
void modify(int x,int l,int r,int L,int R,int d){//区间修改
	if(l>=L&&r<=R) {
		cover(x,l,r,d);
		return;
	}
	int mid=(l+r)>>1;
	pushdown(x,l,r);
	if(L<=mid) modify(lc(x),l,mid,L,R,d);
	if(R>mid) modify(rc(x),mid+1,r,L,R,d);
	sm[x]=sm[lc(x)]+sm[rc(x)];
}
int query(int x,int l,int r,int L,int R){//区间查询
	int res=0;
	if(l>=L&&r<=R)return sm[x];
	int mid=(l+r)>>1;
	pushdown(x,l,r);
	if(L<=mid)res+=query(lc(x),l,mid,L,R);
	if(R>mid) res+=query(rc(x),mid+1,r,L,R);
	return res;
}

AC CODE

#include<bits/stdc++.h>
using namespace std;
#define int long long int
#define lc(x) (x<<1)
#define rc(x) ((x<<1)|1)
const int N=1e6;
int sm[N<<2],tag[N<<2],a[N<<2];
void build(int x,int l,int r){
	tag[x]=0;
	if(l==r){
		sm[x]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(lc(x),l,mid);
	build(rc(x),mid+1,r);
	sm[x]=sm[lc(x)]+sm[rc(x)];
}
void cover(int x,int l,int r,int d){
	sm[x]+=(r-l+1)*d;
	tag[x]+=d;
}
void pushdown(int x,int l,int r){
	if(tag[x]){
		int mid=(l+r)>>1;
		cover(lc(x),l,mid,tag[x]);
		cover(rc(x),mid+1,r,tag[x]);
		tag[x]=0;
	}
}
void modify(int x,int l,int r,int L,int R,int d){
	if(l>=L&&r<=R) {
		cover(x,l,r,d);
		return;
	}
	int mid=(l+r)>>1;
	pushdown(x,l,r);
	if(L<=mid) modify(lc(x),l,mid,L,R,d);
	if(R>mid) modify(rc(x),mid+1,r,L,R,d);
	sm[x]=sm[lc(x)]+sm[rc(x)];
}
int query(int x,int l,int r,int L,int R){
	int res=0;
	if(l>=L&&r<=R)return sm[x];
	int mid=(l+r)>>1;
	pushdown(x,l,r);
	if(L<=mid)res+=query(lc(x),l,mid,L,R);
	if(R>mid) res+=query(rc(x),mid+1,r,L,R);
	return res;
}
int n,m;
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int o;
		cin>>o;
		if(o == 1){
			int l,r,k;
			cin>>l>>r>>k;
			modify(1,1,n,l,r,k);
		}
		if(o == 2){
			int l,r;
			cin>>l>>r;
			cout<<query(1,1,n,l,r)<<endl;
		}
	}
	return 0;
}

附封面(虽然我不是三玖党,但是三玖天下第一,三玖不赢还能谁赢啊喂!)

四叶啊,那没事了

请添加图片描述

请添加图片描述

找封面的时候找到两张好图,就一起放力www

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

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

相关文章

深度学习(33)——CycleGAN(1)

深度学习&#xff08;33&#xff09;——CycleGAN&#xff08;1&#xff09; 完整项目在在这里&#xff1a;欢迎造访 文章目录 深度学习&#xff08;33&#xff09;——CycleGAN&#xff08;1&#xff09;1. Generator2. Discriminator3. fake pool4. loss定义5. 模型参数量6…

Nodejs 第七章(发布npm包)

发布npm的包的好处是什么 方便团队或者跨团队共享代码&#xff0c;使用npm包就可以方便的管理&#xff0c;并且还可以进行版本控制做开源造轮子必备技术&#xff0c;否则你做完的轮子如何让别人使用难道是U盘拷贝&#xff1f;面试题我面字节的时候就问到了这个增加个人IP 让更…

消息队列之 - 消息持久化设计

目录 前言设计思想消息文件的格式垃圾回收的思想其他情况序列化和反序列化 具体代码实现测试消息文件 前言 我们之前说过, 消息队列不管要往硬盘中存储, 还要往内存中存储, 并且是以内存为主 ,硬盘为辅, 接下来, 就将消息队列如何存储到硬盘 做一个设计 设计思想 我们往硬盘…

云服务器无法远程连接服务

问题 今天刚买了华为的云服务器&#xff0c;通过宝塔安装了对应的基础服务&#xff0c;也在华为云的官网上设置了安全组。此时万事俱备只欠东风&#xff0c;我测试使用sqlyog进行远程连接。原本已经在准备部署项目了&#xff0c;现实给了我重重的一拳。 sqlyog爆2003代码错误&…

交换机VLAN技术和实验(eNSP)

目录 一&#xff0c;交换机的演变 1.1&#xff0c;最小网络单元 1.2&#xff0c;中继器&#xff08;物理层&#xff09; 1.3&#xff0c;集线器&#xff08;物理层&#xff09; 1.4&#xff0c;网桥&#xff08;数据链路层&#xff09; 二&#xff0c;交换机的工作行为 2.…

IO进线程——库的制作(静态库、动态库)

库的制作 1、静态库 ①生成二进制文件 gcc -c linkstack.c -o linkstack.o②制作静态库文件&#xff0c;把.o文件转换为.a文件 ar crs liblinkstack.a linkstack.o③编译时链接 gcc linkstack_main.c -L. -llinkstack2、动态库 ①生成地址无关二进制文件 gcc -fPIC -c l…

《工具箱-VNCServer》配置VNCServer,使用VNCViewer实现局域网内页面共享

VNCServer设置 通过VNCServer配置&#xff0c;与VNCviewer配套使用 1.下载并安装VNCServer 2.邮箱密码注册后用户登录 3.设置VNC密码 4.设置viewer不能控制本机 5.打开VNClicensewiz&#xff0c;选择“Enter a license key …” BQ24G-PDXE4-KKKRS-WBHZE-F5RCA BQ24G-PDXE4-…

mysql进阶-修改linux服务器中MySQL的字符集

1.背景 linux中mysql8默认的字符集是latin1&#xff0c;在插入中文时会报错&#xff0c;所以一般在配置好mysql时需要修改字符集为utf8【又叫utfmb3,一般开发够用&#xff0c;一个字符用3个字节表示】或者utfmb4【一个字符用4个字节表示&#xff0c;如果存储emoji表情&#xf…

Linux实战:五子棋

一、五子棋原理 采用二维数组保存棋盘信息,棋盘上面的任何一个位置,里面可以放置三类信息。 空用户1的落子(黑子)用户2的落子(白子)下棋就是在二维数组中找对应的空位置,进行落子落完子之后下来就要考虑该落子位置是否有”五子连珠“,进而进行输赢判定,每一次走棋,多…

如何让python在手机上运行,python在手机上怎么运行

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python程序如何在手机上运行&#xff0c;如何让python在手机上运行&#xff0c;现在让我们一起来看看吧&#xff01; 在计算机语言的运用过程中PythonS60手机是经常被使用的计算机语言&#xff0c;以下的文章是介绍Pyth…

华为OD机试真题 JavaScript 实现【明明的随机数】【2023Q1 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、JavaScript算法源码 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试&#xff0c;发现新题目&#x…

Python超实用!批量重命名文件/文件夹,只需1行代码

大家好&#xff0c;这里是程序员晚枫&#xff0c;之前在小破站给大家分享了一个视频&#xff1a;批量重命名文件。 最近在程序员晚枫的读者群里&#xff0c;发现很多朋友对这个功能很感兴趣&#xff0c;尤其是对下一步的优化&#xff1a;批量重命名文件夹。 这周我利用下班时…

Java 解析Excel单元格的富文本

1. 总体介绍 该方法是解析 xlsx 单元格中的富文本&#xff0c;注意不是 xls&#xff0c;xls 的 api 不一样&#xff0c;试了很久没成功。只实现了解析 斜体字、上下标&#xff0c;其它的实现方式应该类似。 2. 具体实现 2.1 代码 package util;import java.io.FileInputStr…

嵌入式一开始该怎么学?学习单片机

学习单片机&#xff1a; 模电数电肯定必须的&#xff0c;玩单片机大概率这两门课都学过&#xff0c;学过微机原理更好。 直接看野火的文档&#xff0c;芯片手册&#xff0c;外设手册。 学单片机不要纠结于某个型号&#xff0c;我认为stm32就OK&#xff0c;主要是原理和感觉。…

【ZYNQ】Linux驱动之梦开始的地方

软件版本&#xff1a;Vivado2021.1 操作系统&#xff1a;WIN10 64bit、Ubuntu18.04 硬件平台&#xff1a;ZYNQ UltraScale 文章目录 1.1系统框图1.2介绍1.2.1寄存器查询手册1.2.2物理地址与虚拟地址1.2.3MIO介绍1.2.4PS的LED 引脚介绍 1.3搭建工程1.4程序分析1.4.1驱动程序分析…

edgeConnector新版兼容ARM-为用户提供更多部署方案

Softing工业自动化的edgeConnector产品新版3.50兼容ARM处理器——大大扩展了edgeConnector产品的应用范围。 &#xff08;edgeConnector新版兼容ARM——为用户提供更多部署方案&#xff09; Softing edgeConnector产品系列是基于Docker的软件应用&#xff0c;可访问SIMATIC S7、…

QT 在label上透明绘图

一、新建TransparentDemo工程 二、在界面上添加label&#xff0c;修改样式表&#xff0c;将底色置为红色&#xff0c;作为北京 三、新建一个TransparentLabel类&#xff0c;继承自QLabel 此时&#xff0c;工程包括文件 五、在transparentlabel.h中添加 头文件 #include …

静态分析全解析:助力高质量软件开发,降低成本风险

按时发布高质量版本、需要满足编码和合规标准&#xff0c;而且决不能出现错误……静态分析为那些面临巨大压力的队伍提供了帮助。 这就是为什么开发团队都在使用静态分析/源代码分析工具。本篇文章将讨论静态分析、使用静态代码分析器的优势&#xff0c;以及静态分析的局限性。…

MySQL语法

Mysql通用语法 SQL可多行书写&#xff0c;分号结尾SQL语句可以使用空格进行缩进&#xff0c;增加可读性MYSQL&#xff0c;不区分大小写&#xff0c;但关键字推荐使用大写注释&#xff1a; 单行注释&#xff1a;--注释内容 或#注释内容 多行注释&#xff1a;/*注释内容*/ SQ…

声音从何而来?如何保护自己免受聊天工具中欺诈性语音邮件的侵害?

&#x1f5e3; 并不是每个人都喜欢在信使上收到语音邮件。 如果它们也是骗子发来的&#xff0c;那就更令人不快了。 让我们来看看攻击者都会使用哪些手段吧 社交工程 骗子可以使用语音信息而不是电话来散布虚假信息&#xff0c;例如&#xff0c;以银行的名义散布有关账户问…