P3368 【模板】树状数组 2 (树状数组小进阶)(内附封面)

news2024/11/24 18:28:49

【模板】树状数组 2

题目描述

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

  1. 将某区间每一个数加上 x x x

  2. 求出某一个数的值。

输入格式

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

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

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

操作 1 1 1: 格式:1 x y k 含义:将区间 [ x , y ] [x,y] [x,y] 内每个数加上 k k k

操作 2 2 2: 格式:2 x 含义:输出第 x x x 个数的值。

输出格式

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

样例 #1

样例输入 #1

5 5
1 5 4 2 3
1 2 4 2
2 3
1 1 5 -1
1 3 5 7
2 4

样例输出 #1

6
10

提示

样例 1 解释:

故输出结果为 6、10。


数据规模与约定

对于 30 % 30\% 30% 的数据: N ≤ 8 N\le8 N8 M ≤ 10 M\le10 M10

对于 70 % 70\% 70% 的数据: N ≤ 10000 N\le 10000 N10000 M ≤ 10000 M\le10000 M10000

对于 100 % 100\% 100% 的数据: 1 ≤ N , M ≤ 500000 1 \leq N, M\le 500000 1N,M500000 1 ≤ x , y ≤ n 1 \leq x, y \leq n 1x,yn,保证任意时刻序列中任意元素的绝对值都不大于 2 30 2^{30} 230

朴素树状数组

大致思路

要用树状数组完成这个题目,我们就需要它的进阶用法来实现区间修改和单点查询了

前置知识——差分

设数组a [ ] = { 1,6,8,5,10 },那么差分数组b [ ] = { 1,5,2,-3,5 }

也就是说b [ i ] = a [ i ] - a [ i - 1 ] ; ( a [ 0 ] =0 ; ) ,那么 a [ i ] = b [ 1 ] + . . . . + b [ i ] ; (这个很好证的)。

假如区间[2,4]都加上2的话

a数组变为a[ ] = { 1,8,10,7,10 },b数组变为b = { 1,7,2,-3,3 };

发现了没有,b数组只有b[2]和b[5]变了,因为区间[2,4]是同时加上2的,所以在区间内b[i]-b[i-1]是不变的.

所以对区间[ x , y ]进行修改,只用修改b [ x ]与b [ y+1 ]:

b [ x ] = b [ x ] + k ; b [ y + 1 ] = b [ y + 1 ] − k ; b[x]=b[x]+k;b[y+1]=b[y+1]-k; b[x]=b[x]+k;b[y+1]=b[y+1]k;

我们用树状数组来维护一个差分数组以此实现区间加与单点查询

区间加

首先将差分数组存储到树状数组中,树状数组同模板,不变。

struct bit_tree{
	int tr[N];
	void add(int x,int ad){
		while(x<=n){
			tr[x]+=ad;
			x+=lowbit(x);
		}
	}
	int query(int x){
		int ans=0;
		while(x){
			ans+=tr[x];
			x-=lowbit(x);
		}
		return ans;
	}
}t1;
for(int i=1;i<=n;i++){
		cin>>k1;
		t1.add(i,k1-k2);
		k2=k1;
	}

**当我们进行 [ l , r ] [l,r] [l,r]的区间加操作时,对应为 a d d ( l , a d ) ; a d d ( r + 1 , − a d ) ; add(l,ad); add(r+1,-ad); add(l,ad);add(r+1,ad);

代码实现

	t1.add(xx,kk);
	t1.add(yy+1,-kk);

单点查询

根据差分, a [ i ] = ∑ j = 1 i b [ j ] a[i]= \sum\limits_{j=1}^i b[j] a[i]=j=1ib[j] ,单点查询也就是差分数组的前缀和,因此直接query即可
代码实现

int query(int x){
		int ans=0;
		while(x){
			ans+=tr[x];
			x-=lowbit(x);
		}
		return ans;
	}
	cout<<t1.query(xx)<<endl;

AC CODE

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+233;
#define int long long int
int n,m;
int lowbit(int x){
	return x&-x; 
}
struct bit_tree{
	int tr[N];
	void add(int x,int ad){
		while(x<=n){
			tr[x]+=ad;
			x+=lowbit(x);
		}
	}
	int query(int x){
		int ans=0;
		while(x){
			ans+=tr[x];
			x-=lowbit(x);
		}
		return ans;
	}
}t1;

signed main(){
	cin>>n>>m;
	int k1,k2=0;
	for(int i=1;i<=n;i++){
		cin>>k1;
		t1.add(i,k1-k2);
		k2=k1;
	}
	while(m--){
		int op,xx,yy,kk;
		cin>>op;
		if(op==1){
			cin>>xx>>yy>>kk;
			t1.add(xx,kk);
			t1.add(yy+1,-kk);
		}
		else if(op==2){
			cin>>xx;
			cout<<t1.query(xx)<<endl;
		}
	}
	return 0;
}

附封面(屑魔女*2)

请添加图片描述

请添加图片描述

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

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

相关文章

Jenkins 自动化部署实例讲解,另附安装教程!

【2023】Jenkins入门与安装_jenkins最新版本_丶重明的博客-CSDN博客 也可以结合这个互补看 前言 你平常在做自己的项目时&#xff0c;是否有过部署项目太麻烦的想法&#xff1f;如果你是单体项目&#xff0c;可能没什么感触&#xff0c;但如果你是微服务项目&#xff0c;相…

Vue-----package.json

前言 package.json是Node.js应用程序中的配置文件&#xff0c;它在Vue项目中同样非常重要。在Vue中&#xff0c; package.json文件包含了有关你的应用程序的重要信息&#xff0c;如版本号、依赖项、脚本等。 文件结构 package.json文件通常包含以下内容&#xff1a; {"n…

【Matter】基于Ubuntu 22.04 交叉编译chip-tool

编译工程之际&#xff0c;记录一下编译过程&#xff0c;免得后续遗忘&#xff0c;总结下来chip-tool 交叉编译涉及到的知识点&#xff1a; 需要了解如何支持交叉编译&#xff0c;基于GN编译框架需要理解应用库如何交叉编译&#xff0c;理解pkg-config的使用meson 编译&#xf…

Activiity跳转startActivity源码分析Activity启动流程(上)

1.Activity的startActivity 2.也是调用了Activity的startActivityForResult 3.实际还是startActivityForResult 带option的方法&#xff0c;只不过null传过去的 4.接着调用了 Instrumentation的execStartActivity方法 5.然后是IActivityManager的startActivity 6.IActivity…

WebDAV之π-Disk派盘 + Mountain Duck

Mountain Duck是来自国外的一款方便实用,功能强大的云存储空间本地管理工具。它可以帮助我们在windows电脑上将远程 FTP 空间、WebDAV、Swift、S3、Azure、Rackspace、Google Cloud 等云存储服务转入本地进行管理,使用任何应用程序即可打开远程文件,并在本地盘上工作。你可以…

CUDA_CHECK(cudaFree(...))报错CUDA error 1

GPT-3.5太好用了&#xff0c;报错情况如下&#xff1a; 总结一下, 在使用cudaFree释放之前cudaMalloc()分配的GPU内存时&#xff0c;报错cuda error,最有可能的几个原因就是&#xff1a; 试图释放已经释放的gpu内存&#xff0c;在调用cudafree&#xff08;&#xff09;时确保没…

小程序自定义tabBar+Vant weapp

1.构建npm&#xff0c;安装Vant weapp&#xff1a; 1&#xff09;根目录下 &#xff0c;初始化生成依赖文件package.json npm init -y 2&#xff09;安装vant # 通过 npm 安装 npm i vant/weapp -S --production 3&#xff09;修改 package.json 文件 开发者工具创建的项…

c++11 标准模板(STL)(std::basic_ifstream)(四)

定义于头文件 <fstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ifstream : public std::basic_istream<CharT, Traits> 类模板 basic_ifstream 实现文件流上的高层输入操作。它将 std::basic_istream…

linux学习笔记(2)----汇编LED灯实验

MX6ULL 的 IO IO的复用功能 这里的只使用了低五位&#xff0c;用来配置io口&#xff0c;其中bit0~bit3(MUX_MODE)就是设置 GPIO1_IO00 的复用功能的&#xff0c;GPIO1_IO00 一共可以复用为 9种功能 IO&#xff0c;分别对应 ALT0~ALT8。每种对应了不同的功能 io的属性配置 HY…

JDBC的书写

文章目录 基本概念操作数据库方式一&#xff08;不建议使用这种查询&#xff0c;可以sql注入&#xff09;读取properties文件 事务转账示例 获取id连接池 基本概念 持久化:把数据放在磁盘上&#xff0c;断电后还是有数据。使用execute 执行增删改返回false,查返回true 操作数…

map和set的使用(基于STL库)

前言 map和set是STL模板库中重要的关联式容器&#xff0c;与序列式容器不同的是&#xff0c;关联式容器里面存储的是<key,value>结构的键值对&#xff0c;在数据检索时比序列式容器效率更高。让我们一起来看看吧&#xff01; 目录 1.set 1.1键值对 1.2set的介绍 1.3set…

点击编辑变完成

<template><div><button click"dialogshowtrue">添加部门</button><div>部门列表</div><el-table ref"multipleTable" :data"form" tooltip-effect"dark" style"width: 100%">&l…

roop 视频换脸

roop: one click face swap. 只用一张人脸图片&#xff0c;就能完成视频换脸。 项目地址&#xff1a; https://github.com/s0md3v/roopColab 部署&#xff1a; https://github.com/dream80/roop_colab 本文是本地部署的实践记录。 环境基础 OS: Ubuntu 22.04.2 LTSKernel: 5…

解决SVN或GIT忽略提交文件的问题

背景 使用IDEA 的SVN插件提交文件是总是会提交一些不需要提交的文件; 我们可以通过一些简单设置忽略这些文件。 git 在项目根目录新建文本文件&#xff0c;修改后缀为.gitignore 文件中添加内容 *.iml .project .gradle/ .idea/ target/ build/ .vscode/ .settings/ .facto…

Day51 算法记录| 动态规划 18(单调栈)

单调栈 739. 每日温度496.下一个更大元素 I503. 下一个更大元素 II42. 接雨水84. 柱状图中最大的矩形 单调栈&#xff1a;找最近的比他大的值 最近大的值&#xff1a;需要一个单调递减的栈&#xff08;大于栈顶元素就弹出&#xff09; 最近最小值&#xff1a;单调递减栈 方向&a…

【大数据】-- docker 启动 mysql 5.7,开启 binlog

1.说明 mysql binlog&#xff1a;二进制日志文件。它有两个作用&#xff0c;一是增量备份&#xff0c;即只备份新增的内容&#xff0c;可以用于恢复数据&#xff1b;二是用于主从复制等&#xff0c;即主节点维护了一个binlog日志文件&#xff0c;从节点从binlog中同步数据。 …

SAP-MM-采购收货操作错误的更正

业务场景: 工厂3000从供应商5555采购物料,下达采购订单时, 采购员错误操作收货101,实际为103, 收货后没有做105过账,后财务反馈未过账,采购员用MIGO+124将103冲销掉, 又重新用101收货,

助力工业物联网,工业大数据之客户回访事实指标需求分析【二十三】

文章目录 1&#xff1a;客户回访事实指标需求分析2&#xff1a;客户回访事实指标 1&#xff1a;客户回访事实指标需求分析 目标&#xff1a;掌握DWB层客户回访事实指标表的需求分析 路径 step1&#xff1a;目标需求step2&#xff1a;数据来源 实施 目标需求&#xff1a;基于客…

Redis实战(4)——Redisson分布式锁

1 基于互斥命令实现分布式锁的弊端 根据上篇文章基于redis互斥命令实现的分布式锁任然存在一定的弊端 1无法重入: 同一个线程无法重新获得同一把锁2超时删除 &#xff1a;会因为超时、任务阻塞而自动释放锁&#xff0c;出现其他线程抢占锁出现并行导致线程不安全的问题3 不可…

HTML基础介绍1

HTML是什么 1.HTML&#xff08;HyperText Mark-up Language&#xff09;即超文本标签语言&#xff08;可以展示的内容类型很多&#xff09; 2.HTML文本是由HTML标签组成的文本&#xff0c;可以包括文字、图形、动画、声音、表格、连接等 3.HTML的结构包括头部&#xff08;He…