P3372 【模板】线段树 1【题解2】

news2025/2/14 1:19:49

本题题解分两篇
此篇为第贰篇,用树状数组
第壹篇:P3372 【模板】线段树 1【题解1】

本文讲解树状数组解决区间修改+区间查询

其它树状数组相关文章:

  • 树状数组讲解+单点修改/查询
  • 树状数组解决区间修改+单点查询

P3372 【模板】线段树 1

题目描述

如题,已知一个数列 { a i } \{a_i\} {ai},你需要进行下面两种操作:

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

输入格式

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

第二行包含 n n n 个用空格分隔的整数 a i a_i ai,其中第 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

提示

对于 15 % 15\% 15% 的数据: n ≤ 8 n \le 8 n8 m ≤ 10 m \le 10 m10
对于 35 % 35\% 35% 的数据: 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 a i , k a_i,k ai,k 为正数,且任意时刻数列的和不超过 2 × 1 0 18 2\times 10^{18} 2×1018

【样例解释】

解析

谁说线段树模板题就要用线段树的?[狗头]
如果用树状数组做的话,本质就是区间修改+区间查询

结论与证明

d [ ] d[] d[]是原数组 a [ ] a[] a[]的差分数组, s n s_n sn是原数组a[0]~a[n]的和
结论: s n = ( n + 1 ) ∗ ( b [ 1 ] + b [ 2 ] + b [ 3 ] + … + b [ n ] ) − ( b [ 1 ] + 2 ∗ b [ 2 ] + 3 ∗ b [ 3 ] + … + n ∗ b [ n ] ) s_n=(n+1)*(b[1]+b[2]+b[3]+…+b[n])-(b[1]+2*b[2]+3*b[3]+…+n*b[n]) sn=(n+1)(b[1]+b[2]+b[3]++b[n])(b[1]+2b[2]+3b[3]++nb[n])
证明:
s n s_n sn

= a [ 1 ] + a [ 2 ] + a [ 3 ] + … + a [ n ] =a[1]+a[2]+a[3]+…+a[n] =a[1]+a[2]+a[3]++a[n]

= b [ 1 ] + ( b [ 1 ] + b [ 2 ] ) + ( b [ 1 ] + b [ 2 ] + b [ 3 ] ) + … + ( b [ 1 ] + b [ 2 ] + b [ 3 ] + … + b [ n ] ) =b[1]+(b[1]+b[2])+(b[1]+b[2]+b[3])+…+(b[1]+b[2]+b[3]+…+b[n]) =b[1]+(b[1]+b[2])+(b[1]+b[2]+b[3])++(b[1]+b[2]+b[3]++b[n])

= n ∗ b [ 1 ] + ( n − 1 ) ∗ b [ 2 ] + ( n − 2 ) ∗ b [ 3 ] + … + b [ n ] =n*b[1]+(n-1)*b[2]+(n-2)*b[3]+…+b[n] =nb[1]+(n1)b[2]+(n2)b[3]++b[n]

= ( n + 1 ) ∗ ( b [ 1 ] + b [ 2 ] + b [ 3 ] + … + b [ n ] ) − ( b [ 1 ] + 2 ∗ b [ 2 ] + 3 ∗ b [ 3 ] + … + n ∗ b [ n ] ) =(n+1)*(b[1]+b[2]+b[3]+…+b[n])-(b[1]+2*b[2]+3*b[3]+…+n*b[n]) =(n+1)(b[1]+b[2]+b[3]++b[n])(b[1]+2b[2]+3b[3]++nb[n])

结论的使用

由于是差分数组,每次原数组的区间修改它只需变两个点的值
差分数组值变了, b [ 1 ] + b [ 2 ] + b [ 3 ] + … + b [ n ] b[1]+b[2]+b[3]+…+b[n] b[1]+b[2]+b[3]++b[n] b [ 1 ] + 2 ∗ b [ 2 ] + 3 ∗ b [ 3 ] + … + n ∗ b [ n ] b[1]+2*b[2]+3*b[3]+…+n*b[n] b[1]+2b[2]+3b[3]++nb[n]的值都会改变
这可以用树状数组维护。
具体结合代码解释

完整代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN=1000005;
int n,m;
int lowbit(int x){
	return x&(-x);
}
//a为原数组,b为差分数组,d为维护b[1]~b[i]的和的树状数组,t为维护b[1]*1~b[i]*i的和的树状数组
int d[MAXN],t[MAXN],a[MAXN],b[MAXN];
int get(int x){
	int u=0,v=0;
	for(int i=x;i;i=i-lowbit(i)){
		u+=t[i];
		v+=d[i];
	}
	return (x+1)*u-v;//结论的使用
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		b[i]=a[i]-a[i-1];
	} 
	for(int i=1;i<=n;i++){
		for(int j=i;j<=n;j+=lowbit(j)){
			t[j]+=b[i];
			d[j]+=i*b[i];
		}
	}
	while(m--){
		int work,l,r,k;
		cin>>work;
		if(work==1){
			cin>>l>>r>>k;
			//原数组的区间修改->差分数组的两个单点修改->树状数组的修改
			for(int i=l;i<=n;i=i+lowbit(i)){
				t[i]+=k;//包含l的节点的值都要改
				d[i]+=l*k;
			}
			for(int i=r+1;i<=n;i=i+lowbit(i)){
				t[i]-=k;
				d[i]-=(r+1)*k;
			}
		}
		else{
			cin>>l>>r;
			cout<<get(r)-get(l-1)<<endl;//前缀和的使用
		}
	}
	return 0;
}

能给个赞嘛?求求了QAQ

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

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

相关文章

使用 EDOT 监测由 OpenAI 提供支持的 Python、Node.js 和 Java 应用程序

作者&#xff1a;来自 Elastic Adrian Cole Elastic 很自豪地在我们的 Python、Node.js 和 Java EDOT SDK 中引入了 OpenAI 支持。它们为使用 OpenAI 兼容服务的应用程序添加日志、指标和跟踪&#xff0c;而无需任何代码更改。 介绍 去年&#xff0c;我们宣布了 OpenTelemetry…

CNN-BiGRU卷积神经网络双向门控循环单元多变量多步预测,光伏功率预测

CNN-BiGRU卷积神经网络双向门控循环单元多变量多步预测&#xff0c;光伏功率预测 代码下载&#xff1a;CNN-BiGRU卷积神经网络双向门控循环单元多变量多步预测&#xff0c;光伏功率预测 一、引言 1.1、研究背景及意义 随着全球能源危机和环境问题的日益严重&#xff0c;可再…

mysql8.0使用MGR实现高可用与利用MySQL Router构建读写分离MGR集群

MGR是MySQL Group Replication的缩写&#xff0c;即MySQL组复制。 在以往&#xff0c;我们一般是利用MySQL的主从复制或半同步复制来提供高可用解决方案&#xff0c;但这存在以下几个比较严重的问题&#xff1a; 主从复制间容易发生复制延迟&#xff0c;尤其是在5.6以前的版本…

保研考研机试攻略:python笔记(4)

🐨🐨🐨15各类查找 🐼🐼二分法 在我们写程序之前,我们要定义好边界,主要是考虑区间边界的闭开问题。 🐶1、左闭右闭 # 左闭右闭 def search(li, target): h = len(li) - 1l = 0#因为都是闭区间,h和l都可以取到并且相等while h >= l:mid = l + (h - l) // 2…

关于conda换镜像源,pip换源

目录 1. 查看当前下载源2. 添加镜像源2.1清华大学开源软件镜像站2.2上海交通大学开源镜像站2.3中国科学技术大学 3.删除镜像源4.删除所有镜像源&#xff0c;恢复默认5.什么是conda-forge6.pip换源 1. 查看当前下载源 conda config --show channels 如果发现多个 可以只保留1个…

分布式服务框架 如何设计一个更合理的协议

1、概述 前面我们聊了如何设计一款分布式服务框架的问题&#xff0c;并且编码实现了一个简单的分布式服务框架 cheese, 目前 cheese 基本具备分布式服务框架的基本功能。后面我们又引入了缓存机制&#xff0c;以及使用Socket替代了最开始的 RestTemplate。并且还学习了网络相关…

前端快速生成接口方法

大家好&#xff0c;我是苏麟&#xff0c;今天聊一下OpenApi。 官网 &#xff1a; umijs/openapi - npm 安装命令 npm i --save-dev umijs/openapi 在根目录&#xff08;项目目录下&#xff09;创建文件 openapi.config.js import { generateService } from umijs/openapi// 自…

mysql 学习12 存储引擎,mysql体系结构

mysql 体系结构 存储引擎简介 存储引擎 就是 存储数据&#xff0c;建立索引&#xff0c;更新/查询 数据等技术的实现方式。 存储引擎 是基于表的&#xff0c;而不是基于库的&#xff0c;所以存储引擎也可以称为 表类型 mysql默认的使用InnoDB 做为存储引擎 查看一下我们之前…

稀土抑烟剂——为汽车火灾安全增添防线

一、稀土抑烟剂的基本概念 稀土抑烟剂是一类基于稀土元素&#xff08;如稀土氧化物和稀土金属化合物&#xff09;开发的高效阻燃材料。它可以显著提高汽车内饰材料的阻燃性能&#xff0c;减少火灾发生时有毒气体和烟雾的产生。稀土抑烟剂不仅能提升火灾时的安全性&#xff0c;…

Unity进阶教程AOI算法原理详解

最新课程《全栈双客户端(Unity/Cocos) TurnKey方案》更新了AOI专题&#xff0c;今天分享一下AOI算法的实现原理。 AOI的功能和作用 在MMORPG网路游戏当中&#xff0c;单服同时在线一般都会有几千人。当有个玩家执行一个操作&#xff0c;理想情况下要把玩家的操作广播同步给单…

【C】链表算法题7 -- 环形链表||

leetcode链接https://leetcode.cn/problems/linked-list-cycle-ii/description/ 问题描述 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到…

STM32系统架构介绍

STM32系统架构 1. CM3/4系统架构2. CM3/4系统架构-----存储器组织结构2.1 寄存器地址映射&#xff08;特殊的存储器&#xff09;2.2 寄存器地址计算2.3 寄存器的封装 3. CM3/4系统架构-----时钟系统 STM32 和 ARM 以及 ARM7是什么关系? ARM 是一个做芯片标准的公司&#xff0c…

window patch按块分割矩阵

文章目录 1. excel 示意2. pytorch代码3. window mhsa 1. excel 示意 将一个三维矩阵按照window的大小进行拆分成多块2x2窗口矩阵&#xff0c;具体如下图所示 2. pytorch代码 pytorch源码 import torch import torch.nn as nn import torch.nn.functional as Ftorch.set_p…

机器学习(李宏毅)——BERT

一、前言 本文章作为学习2023年《李宏毅机器学习课程》的笔记&#xff0c;感谢台湾大学李宏毅教授的课程&#xff0c;respect&#xff01;&#xff01;&#xff01; 读这篇文章必须先了解self-attention、Transformer&#xff0c;可参阅我其他文章。 二、大纲 BERT简介self-…

深度学习-111-大语言模型LLM之基于langchain的结构化输出功能实现文本分类

文章目录 1 langchain的结构化输出1.1 推荐的使用流程1.2 模式定义1.3 返回结构化输出1.3.1 工具调用(方式一)1.3.2 JSON模式(方式二)1.3.3 结构化输出法(方式三)2 文本分类2.1 定义分类模式2.2 配置分类提示模板2.3 初始化分类模型2.4 分类示例3 参考附录1 langchain的结构化输…

常见的排序算法:插入排序、选择排序、冒泡排序、快速排序

1、插入排序 步骤&#xff1a; 1.从第一个元素开始&#xff0c;该元素可以认为已经被排序 2.取下一个元素tem&#xff0c;从已排序的元素序列从后往前扫描 3.如果该元素大于tem&#xff0c;则将该元素移到下一位 4.重复步骤3&#xff0c;直到找到已排序元素中小于等于tem的元素…

C++17 中的 std::gcd:探索最大公约数的现代 C++ 实现

文章目录 一、std::gcd 的基本用法&#xff08;一&#xff09;包含头文件&#xff08;二&#xff09;函数签名&#xff08;三&#xff09;使用示例 二、std::gcd 的实现原理三、std::gcd 的优势&#xff08;一&#xff09;简洁易用&#xff08;二&#xff09;类型安全&#xff…

OpenWRT中常说的LuCI是什么——LuCI介绍(一)

我相信每个玩openwrt的小伙伴都或多或少看到过luci这个东西&#xff0c;但luci到底是什么东西&#xff0c;可能还不够清楚&#xff0c;今天就趁机来介绍下&#xff0c;openwrt中的luci&#xff0c;到底是个什么东西。 什么是LuCI&#xff1f; 首先&#xff0c;LuCI是OpenWRT中…

机器学习核心算法解析

机器学习核心算法解析 机器学习是人工智能的核心技术之一&#xff0c;它通过从数据中学习模式并做出预测或决策。本文将深入解析机器学习的核心算法&#xff0c;包括监督学习、无监督学习和强化学习&#xff0c;并通过具体案例和代码示例帮助读者理解这些算法的实际应用。 1. …

LVDS接口总结--(5)IDELAY3仿真

仿真参考资料如下&#xff1a; https://zhuanlan.zhihu.com/p/386057087 timescale 1 ns/1 ps module tb_idelay3_ctrl();parameter REF_CLK 2.5 ; // 400MHzparameter DIN_CLK 3.3 ; // 300MHzreg ref_clk ;reg …