P3368 【模板】树状数组 2 (区间修改,单点查询)

news2024/11/17 15:29:06

本题链接:【模板】树状数组 2 - 洛谷

题目:

输入
5 5
1 5 4 2 3
1 2 4 2
2 3
1 1 5 -1
1 3 5 7
2 4
输出
6
10

思路:

        根据题意,这里是需要区间添加值,单点查询值。如果区间添加值中暴力去一个个加值,肯定会TLE,所以我们这里运用到了模板树状数组的重要作用了。

        根据 差分 的性质,我们知道,区间加值,我们可以构造一个前缀和数组来表示当前原数组的元素值,对此,进行区间的修改,有效的避免O(n)的时间复杂度。

所以我们可以结合,树状数组的前缀和 + 差分 性质,达到区间修改,单点查询的效果。

下面给出操作函数:

区间修改
// 单点添加元素
inline void Add_pos(int pos,int x)
{
	for(int i = pos;i <= n + 1;i+=lowbit(i)) arr[i] += x;
}

// 区间添加元素
inline void Add_section(int L,int R,int x)
{
	// 利用差分数组的原理,
	// 差分树状数组,
	// 达到区间修改值的效果
	Add_pos(L,x);
	Add_pos(R+1,-x);	
}

单点查询
// 差分前缀和 单点查询
inline int Ask_pos(int pos)
{
	// 利用 差分 性质
	// 差分的前缀和,就是当前的元素值
	// 所以树状数组求前缀和,返回当前下标的元素值
	int ans = 0;
	for(int i = pos;i;i-=lowbit(i)) ans += arr[i];
	return ans;
}

代码详解如下:

#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#define endl '\n'
#define int long long
#define YES puts("YES")
#define NO puts("NO")
#define lowbit(x) (x&(-x))
#define umap unordered_map
#define All(x) x.begin(),x.end()
//#pragma GCC optimize(3,"Ofast","inline")
#define IOS std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
const int N = 7e7 + 10;

int n,m;
int arr[N];	// 构造 差分树状数组
int a[N];	// 记录原数组初始值

// 单点添加元素
inline void Add_pos(int pos,int x)
{
	for(int i = pos;i <= n + 1;i+=lowbit(i)) arr[i] += x;
}

// 区间添加元素
inline void Add_section(int L,int R,int x)
{
	// 利用差分数组的原理,
	// 差分树状数组,
	// 达到区间修改值的效果
	Add_pos(L,x);
	Add_pos(R+1,-x);	
}

// 差分前缀和 单点查询
inline int Ask_pos(int pos)
{
	// 利用 差分 性质
	// 差分的前缀和,就是当前的元素值
	// 所以树状数组求前缀和,返回当前下标的元素值
	int ans = 0;
	for(int i = pos;i;i-=lowbit(i)) ans += arr[i];
	return ans;
}

inline void solve()
{
	cin >> n >> m;
	for(int i = 1;i <= n;++i)
	{
		cin >> a[i];
		Add_pos(i,a[i] - a[i - 1]);	// 单点添加 初始值 的 差分元素
	}
	while(m--)
	{
		int op;
		cin >> op;
		if(op == 1)
		{
			int L,R,x;
			cin >> L >> R >> x;
			Add_section(L,R,x);	// 区间添加值	
		}else
		{
			int pos;
			cin >> pos;	// 差分前缀和单点查询
			cout << Ask_pos(pos) << endl;
		}
	}
}

signed main()
{
//	freopen("a.txt", "r", stdin);
//	IOS;
	int _t = 1;
//	cin >> _t;
	while (_t--)
	{
		solve();
	}

	return 0;
}

最后提交:

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

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

相关文章

springboot 2.x集成h2数据库

1.引入pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency><groupId>com.h2database</groupId><artifactId>h2<…

Java面向对象(高级)-- 接口(interface)

文章目录 一、概念&#xff08;1&#xff09;引入&#xff08;2&#xff09;类比&#xff08;3&#xff09;举例1. 举例12. 举例23. 举例34. 举例4 &#xff08;4&#xff09; 定义格式及重点举例1. 接口的声明格式2. 接口的成员说明3. 接口内部结构的说明4. 举例4.1 举例1--接…

Golang数据类型(数组)

数组重要概念 数组&#xff08;Array&#xff09;是一种非常常见的数据类型&#xff0c;几乎所有的计算机编程语言中都会用到它 在Go语言中&#xff0c;数组有如下的特点&#xff1a; 数组里的元素必须全部为同一类型&#xff0c;要嘛全部是字符串&#xff0c;要嘛全部是整数…

linux 讨论题合集(个人复习)

常规文件的权限是什么&#xff1f;如何分配或修改这些权限&#xff1f;文件夹&#xff08;目录&#xff09;的权限是什么&#xff1f;显示常规文件和文件夹的区别 讨论&#xff1a;①常规的文件权限有四种&#xff0c;r可读、w可写、x可执行、-没有权限&#xff1b;②可以使用c…

【智能家居】一、工厂模式实现继电器灯控制

一、用户手册对应的I/O 二、工厂模式实现继电器灯控制 三、代码段 controlDevice.h&#xff08;设备类&#xff09;main.c&#xff08;主函数&#xff09;bathroomLight.c&#xff08;浴室灯&#xff09;bedroomLight.c&#xff08;卧室灯&#xff09;bedroomLight.c&#xff…

滴滴就系统故障再次致歉

滴滴出行官博发文就11月27日夜间发生的系统故障再次致歉&#xff0c;同时表示&#xff0c;初步确定&#xff0c;这起事故的起因是底层系统软件发生故障&#xff0c;并非网传的“遭受攻击”&#xff0c;后续将深入开展技术风险隐患排查和升级工作&#xff0c;全面保障服务稳定性…

Linux系统centos7防火墙firewall开放IP及端口命令

CentOS7使用的是firewall防火墙&#xff0c;不再是原来的iptables 防火墙基础命令 1&#xff1a;查看firewall防火墙状态 firewall-cmd --state //或 systemctl status firewalld2&#xff1a;打开防火墙 systemctl start firewalld3&#xff1a;关闭防火墙 systemctl sto…

MxL3706-AQ-R 2.0通道绑定同轴网络集成电路特性

MxL3706-AQ-R是Max线性公司的第三代MoCA2.0同轴网络控Z器SoC&#xff0c;可用于在现有的家庭同轴电缆上创建具有千兆位吞吐量性能的家庭网络。 该MxL3706-AQ-R工作在400MHz至1675MHz之间的无线电频率&#xff0c;并与satellite共存&#xff0c;电X和有线电视运营商的频率计划。…

java学习part23异常try catch

124-异常处理-异常的概述与常见异常的举例_哔哩哔哩_bilibili 1.异常 2.try catch 3.finally 类似golang的defer 一定执行的语句

用Java制作简易版的王者荣耀

第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 创建类 GameFrame 运行类 package com.sxt;import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import j…

HarmonyOS4.0开发应用(二)【快速学习】

快速学习 创建项目 1.开始创建 2.选择模板 刚开始选择空白的模板即可 3.填写项目信息 这样一个基本项目就创建好了 代码结构 实现Demo(文字动态切换) Entry Component struct Index {State message: string Hello Worldbuild() {Row() {Column() {Text(this.message).fo…

文件fd【Linux系统编程】

本文是基础IO的第一个部分&#xff0c;基础IO部分将主要讲解以下内容&#xff1a;文件fd 文件系统 软硬链接 操作系统的内存管理 以及 动静态库。本节重点讲解文件fd&#xff0c;其余内容将在后面的博客更新。 一、共识 文件 内容 属性 文件分为打开了的文件和没打开的文件。…

YOLOv7独家原创改进:自研独家创新FT_Conv,卷积高效结合傅里叶变换

💡💡💡本文自研创新改进:卷积如何有效地和频域结合,引入分数阶傅里叶变换和分数阶Gabor变换,最终创新到YOLOv7。 推荐指数:五星 在道路缺陷检测任务中,原始map为0.8,FT_Conv为0.82 收录YOLOv7原创自研 https://blog.csdn.net/m0_63774211/category_12511937.htm…

Mysql之子查询(知识点+例题)

Mysql之子查询<知识点例题> 什么是子查询案例分析案例分析子查询的分类单行子查询子查询中的空值问题题目练习题目一题目二题目三题目四题目五补充&#xff1a;聚合函数与GROUP BY的使用关系 CASE表达式&#xff08;子查询中的运用&#xff09;简单CASE表达式搜索CASE表达…

第72讲:MySQL数据库锁机制剖析:行级锁、间隙锁与临键锁详解及应用指南

文章目录 1.行级锁的概念2.行锁的概念以及基本使用2.1.行锁的概念2.2.常见的SQL语句所对应的行锁类别2.3.行锁的基本使用 3.间隙锁和临键锁的概念以及基本使用3.1.间隙锁和临键锁的概念3.2.间隙锁和临键锁的基本使用 1.行级锁的概念 行级锁指的是&#xff0c;每次操作锁住的是…

PyCharm免费安装和新手使用教程

PyCharm是一款由JetBrains公司开发的Python集成开发环境&#xff08;IDE&#xff09;。它提供了一系列强大的功能&#xff0c;包括自动代码完成、语法高亮、自动缩进、代码重构、调试器、测试工具、版本控制工具等&#xff0c;使开发者可以更加高效地开发Python应用程序。 新手…

C++中的类型转换和异常

C类型转换 类型转换(cast) 是将一种数据类型转换成另一种数据类型。例如&#xff0c;如果将一个整型 值赋给一个浮点类型的变量&#xff0c;编译器会暗地里将其转换成浮点类型。 转换是非常有用的&#xff0c;但是它也会带来一些问题&#xff0c;比如在转换指针时&#xff0c…

a-table:表格组件常用功能记录——基础积累2

antdvue是我目前项目的主流&#xff0c;在工作过程中&#xff0c;经常用到table组件。下面就记录一下工作中经常用到的部分知识点。 a-table&#xff1a;表格组件常用功能记录——基础积累2 效果图1.table 点击行触发点击事件1.1 实现单选 点击事件1.2 实现多选 点击事件1.3 实…

高效办公:如何使用视频剪辑工具批量转码,mp4视频到TS视频

在视频处理过程中&#xff0c;转码是一项常见的任务。将MP4视频转换为TS视频可以提供许多优势&#xff0c;包括更好的兼容性、更广泛的设备和平台支持以及更高的视频质量。然而&#xff0c;手动转码大量视频文件可能会非常耗时且效率低下。为了实现高效办公&#xff0c;可以使用…

模板引擎详解

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 &#x1f324;️动态页面的渲染方式 …