树状数组关于区间修改区间求和的问题

树状数组( 单点修改/区间修改+区间求和+一维/二维) 树状数组(Binary Indexed Tree(BIT), Fenwick Tree)是一个查询和修改复杂度都为log(n)的数据结构。主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值;经过简单修改可以在log(n)的复杂度下进行范围修改,但是这时只能查询其中一个元素的值。首先照例附上树状数组的百度百科解释。实际上,经过“简单修改”可以做到区间修改与区间求和。树状数组,在你写线 阅读详情
Total Submission(s) : 77   Accepted Submission(s) : 19
Problem Description

You have N integers, A1,A2, ... ,AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the sum of numbers in a given interval.

 

Input
<p>The first line contains two numbers <i>N</i> and <i>Q</i>. 1 ≤ <i>N</i>,<i>Q</i> ≤ 100000.<br>The second line contains <i>N</i> numbers, the initial values of <i>A</i><sub>1</sub>, <i>A</i><sub>2</sub>, ... , <i>A<sub>N</sub></i>. -1000000000 ≤ <i>A<sub>i</sub></i> ≤ 1000000000.<br>Each of the next <i>Q</i> lines represents an operation.<br>"C <i>a</i> <i>b</i> <i>c</i>" means adding <i>c</i> to each of <i>A<sub>a</sub></i>, <i>A<sub>a</sub></i><sub>+1</sub>, ... , <i>A<sub>b</sub></i>. -10000 ≤ <i>c</i> ≤ 10000.<br>"Q <i>a</i> <i>b</i>" means querying the sum of <i>A<sub>a</sub></i>, <i>A<sub>a</sub></i><sub>+1</sub>, ... , <i>A<sub>b</sub></i>.</p>
 

Output
<p>You need to answer all <i>Q</i> commands in order. One answer in a line.</p>
 

Sample Input
10 5 1 2 3 4 5 6 7 8 9 10 Q 4 4 Q 1 10 Q 2 4 C 3 6 3 Q 2 4
 

Sample Output
4 55 9 15
题意:
就是给你N个数M个操作,然后输出每一个查询区间的和。 
这是最基础的区间修改区间求和的实现问题。
#if 0
#include<iostream>
#include<cstring>
#include<stdio.h>

using namespace std;
const int MAXN=100000+50;
typedef long long ll;
ll  b[MAXN],c[MAXN];
ll  a[MAXN]; 

int lowbit(ll  x)
{
	return x&(-x);
}

void add_B(ll  *a,ll  x,ll  v)
{
	for( ; x>0; x-=lowbit(x))
		a[x]+=v;
}
ll sum_B(ll  *a,ll  x)
{
	ll  s=0;
	for(; x<MAXN; x+=lowbit(x))
	{
		s+=a[x];
	}
	
	return s;
}

void add_C(ll  *a,ll  x,ll v)
{
	for( ; x<MAXN; x+=lowbit(x))
	{
		a[x]+=v;
	}
	
}
ll sum_C(ll *a, ll x)
{
	ll s=0;
	for( ; x>0; x-=lowbit(x))
	{
		s+=a[x];
	}
	return s;
}

void add(ll x,ll v)
{
	add_B(b,x-1,v);
	add_C(c,x,v*x);
}
void go_add(ll a,ll b,ll v)
{
	add(b,v);
	add(a-1,-v); //
}

ll sum(ll x)
{
	return sum_C(c,x)+sum_B(b,x)*x;
}
ll go_sum(ll a,ll b)
{
	return sum(b)-sum(a-1);
}

int main()
{


	ll n,t;
	char ssc;

	scanf("%lld%lld",&n,&t);
	
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	
	for(int i=3; i<=n+2; i++)
	{
		ll x;
		scanf("%lld",&x);
		go_add(i,i,x);
	}
	

	while(t--)
	{
		
		cin>>ssc;
		if(ssc=='Q')
		{
			ll ai,bi;
			
			scanf("%lld%lld",&ai,&bi);
			ai+=2;
			bi+=2;
	
			
			printf("%lld\n",go_sum(ai,bi));	
		}
		else if(ssc=='C')
		{
			ll ai,bi;
			ll v;
			scanf("%lld%lld%lld",&ai,&bi,&v);
			
			ai+=2;
			bi+=2;
			go_add(ai,bi,v);
		}

	}


}
#endif


























【树状数组】【单点修改区间求和】【区间修改单点查询】【单点修改区间最大值查询】 树状数组: 阅读详情

相关推荐

一个简单的整数问题2(树状数组:区间查询&&区间修改)

给定一个长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1、“C l r d”,表示把 A[l],A[l+1],…,A[r] 都加上 d。 2、“Q l r”,表示询问 数列中第 l~r 个数的和。 对于每个询问,输出一个整数表示答案。 输入格式 第一行两个整数N,M。 第二行N个整数A[i]。 接下来M行表示M条指令,每条指令的格式如题目描述所示。 输出格式 对于每个询问,输出一个整数表示答案。 每个答案占一行。 数据范围 1≤N,M≤105, |d|≤10000, |A[i]|≤1000000000 输入样例: 10 5 1 2 3 4 5 6 7 8 9 10 Q 4 4

树状数组区间修改和区间求和

最一般树状数组能做到的操作是单点修改,区间求和,都是log(n)级别的。原理就是用树状数组维护a[i]的部分和。 想要做到修改区间,求单点值也很简单,用树状数组维护a[i]的差分数组d[i]的部分和既可。 那么,如何同时做到区间求和,区间修改呢? 有人可能会说了,如果是区间求和区间修改的话,直接写线段树不就好了吗? 但是,从代码长度来看(dalao请无视),显然使用树状数组在考...

weixin_30835649的博客 1542

RT-Thread代码启动过程——以及 $Sub$ $main 与 $Super$ $main

我们找到系统复位的地方,可以往下单步跟踪。 ①从系统初始化开始执行,将函数地址赋给R0寄存器,跳转到R0地址执行并返回此处(BLX是带链接的跳转,即带返回的跳转)。 ②将main函数地址给R0,将函数地址赋给R0,跳转到R0地址执行,不返回(BX是跳转,不返回)。 ③跳转到了$Sub$$main。 【注:在 __CC_ARM 编译器环境下,使用了$Sub$$ 与$Super$ $ 的...

yang1111111112的博客 1万+

树状数组的区间修改求和

差分数组:c[i]=a[i]-a[i-1] 然后可以发现 a[i]=a[1]+a[2]-a[1]+a[3]-a[2]+…+a[i]-a[i-1]=c[1]+c[2]+…+c[i] 1,区间修改单点查询 修改a[l]到a[r]值 的时候,只需修改c[l]和c[r+1],然后求一次c[i]的前缀和就可以。 2,区间修改区间查询 还是利用差分的思想。区间求和的公式为: sum(1,n) =

blue_kid的博客 534

保姆级教程:在Win10/Win11上搞定AppScan 10.0.0安装与许可证激活(含常见报错解决)

本文提供AppScan 10.0.0在Win10/Win11上的详细安装与许可证激活指南,涵盖环境准备、分步安装、文件替换技巧及常见报错解决方案。通过专业的安全测试工具部署实践,帮助用户高效完成安装并避免常见陷阱,提升Web应用安全扫描效率。

weixin_30800987的博客 425

基于 Go 的微信滑块验证码自动化:协议还原与图像算法深度解析

本文从协议层、算法层和工程优化三个维度,系统拆解了基于Go的微信滑块验证码自动化方案。在协议层,通过手写protobuf编码器和RSA加密复现了微信UUID生成机制;在算法层,采用图像匹配技术实现滑块缺口定位;在工程层面,构建了包含HTTP状态机和随机化设备指纹的完整验证流程。文章重点阐述了技术实现的形式化建模、算法选择依据和复杂度分析,为工程师和算法研究者提供了可验证的技术方案。核心代码结构包括UUID生成、滑块状态机和图像匹配算法等模块,通过分层设计实现了高效可靠的验证码自动化破解。

weixin_65409651的博客 1293

北京大学OpenJudge 3243 A Simple Problem with Integers (线段树区间求和)

描述 You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for ...

qq_37618760的博客 286

单视图几何Vanish Point(消失点/灭点)计算方法——Robert_T_Collins(罗伯特·柯林斯)算法

单视图几何Vanish Point(消失点/灭点)计算方法——Robert_T_Collins(罗伯特·柯林斯)算法

beyond951的博客 7333

树状数组,区间修改+区间求和

树状数组区间修改加区间求和

nufu_cow的博客 399

开发板的使用

一、开发板使用学习大纲。 1、开发板组成、核心板资源,底板资源。 2、开发板连接、调试工具、串口参数配置。 3、开发板启动过程。 4、文件传输 1)使用串口传输。 上传/下载 2)使用网口传输。 上传/下载 5、临时/永久配置开发板IP地址。 6、开发板启动脚本。 二、开发板的组成。 核心板: CPU处理器: 芯片:S5P6818(三星) 内核: ARM cortex-A53 -> 八核处理器 运行内存:512MB*2=1G nandflash:4G 底板: 电源线:5V 串口...

qq_45633736的博客 2659

2026年复旦微电数字IC笔试试卷带答案解析

摘要: 本文为复旦微电子MCU/SOC岗位笔试模拟题,涵盖单片机架构、数字电路、存储技术等核心知识点。内容包括: 单选题(30分):考察Cortex-M中断机制、时序分析(建立/保持时间)、逻辑化简、跨时钟域设计(格雷码应用)、存储器特性(NAND Flash操作单元)等; 波形分析(15分):聚焦D触发器行为、时钟分频、建立时间违例判断及跨时钟域同步; 多选题(25分):涉及亚稳态成因与处理、异步FIFO设计要点、MCU低功耗策略、NAND Flash特性及复旦微电市场地位; 简答题(20分):解析建立/

Open 344

算法提高-树状数组

事实上能写出这种代码还是没有理解树状数组的作用是啥,树状数组的作用就是区间求和和单点修改,使得区间求和和单点修改的复杂度都不至于太慢。因为多维护一个i * b[i], add函数里面的c可能会爆int,所以要强转一下。树状数组擅长的是单点加然后求区间和,本题是区间加然后求单点和;前缀和的区间求和复杂度是1,单点修改的复杂度是n;数组的区间求和复杂度是n,单点修改复杂度是1。树状数组的区间求和和单点修改的复杂度都是。差分数组b[]和原数组a[]的关系。

chirou_的博客 499

2-1 AUTOSAR ASW概述

应用软件层(Application Software Layer,ASW)位于AUTOSAR整个架构的顶层。它由各种AUTOSAR Software Component(SW-C)组成,每个SW-C封装了各种应用的功能集。每个SW-C只能运行在一个ECU中。ASW层的设计目标是实现功能的可重用性和可配置性。它通过封装底层提供的服务,为上层应用层提供统一的接口。ASW层的开发可以基于AUTOSAR提供的标准化软件组件,也可以根据具体需求进行定制开发。

qq_42357877的博客 1903

acwing 243. 一个简单的整数问题2(树状数组区间修改、区间求和)

题意 代码 #include <bits/stdc++.h> using namespace std; #define ls (k << 1) #define rs (k << 1 | 1) #define ll long long const int N = 1e5 + 10; int n, m; int a[N]; struct Tree { int l, r; ll sum, add; } tr[N * 4]; void push_up(int k)

做一只熊猫不好吗? 200

揭秘大厂 Unity 红点系统设计:别小看右上角那颗小红点,它能把你项目搞崩

本文详细探讨了游戏大厂如何设计高性能红点系统。红点作为提升用户活跃和转化率的重要工具,需要支持多级联动、动态判断和全局一致性。系统采用观察者模式和树形结构,分为数据管理、逻辑判定、订阅通知和UI展示四大模块,通过事件驱动方式实现高效刷新。文章特别强调了解耦设计、配置化管理和性能优化,并提出了热更新、数据分析等高级应用场景。最终指出,优秀的红点系统需要架构标准化、自动化配置和团队紧密协作,是大型游戏项目的关键技术基础。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 377

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

树状数组

树状数组总结。

ZigZagK的博客 771

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

树状数组总结

因为树状数组用得比较少,所以今天总结一下常见用法。(顺便贴一些板) 首先上树状数组的定义:设原数组为a,树状数组为c,那么c[i]=a[i-2^k+1]+a[i-2^k+2]……+a[i]。其中k为i的二进制状态下最后面连续的0的个数。 然后我们就可以得出树状数组的修改和查询操作了。 查询:因为c[i]表示的是连续的一段a的和,那么查询的时候我们每次把当前的c[i]加上时候就把i减去一段数,...

chiyankuan的博客 369

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

详解树状数组(C/C++)

树状数组(Binary Indexed Tree,简称BIT或Fenwick Tree)是一种用于高效处理数据序列的算法数据结构。它能够支持两个主要操作:单点更新和区间求和,这两个操作的时间复杂度都能达到O(log n),其中 n是数据序列的长度。树状数组非常适合处理那些需要频繁更新和查询区间和的问题。

闻道有先后,术业有专攻 2752

25钉耙春季赛4-1006进步-树状数组

常规来看是一个前缀和问题,但是看到范围就会发现一定是会超,每次更改一个值就会引起在这之后以及这个位置的所有前缀和变动。因此,机会给到了树状数组。一个可以解决大部分区间修改以及存储的数据结构。树状数组本人也是折腾了很久,找了很多资料,终于找到了一个非常伟大的树状数组介绍视频(o(╥﹏╥)o)大家可以点进去。本人也是细细品了两遍。

2402_89257744的博客 360

树状数组(单点修改&&区间查询、区间修改&&单点查询、区间修改&&区间查询)

今天看了一下树状数组,个人认为树状数组是一个很优美的数据结构,虽然看的并不是很懂。。。一些简单的知识就不讲的,请自行百度。。不过还是讲一些最基础的吧。 概述 树状数组(binary indexed tree),是一种设计新颖的数组结构,它能够高效地获取数组中连续n个数的和。概括说,树状数组通常用于解决以下问题:数组{a}中的元素可能不断地被修改,怎样才能快速地获取一个区间的和? 树状数组基本...

ityanger的技术栈 8059

树状数组 1/30

树状数组分为三大类: 1.单点修改+区间求和 2.区间修改+单点求和(运用工具差分数组) 3.区间修改+区间求和(维护两个数组的前缀和) 典型的差分思想: https://www.luogu.com.cn/problem/P3655 #include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=2e5+5; ll N,S,Q,T,c[maxn],ls; ll ans; inline ll c

weixin_51934288的博客 184

树状数组例题2AcWing243

一个简单的整数问题2 给定一个长度为 N 的数列 A,以及 M 条指令,每条指令可能是以下两种之一: C l r d,表示把 A[l],A[l+1],…,A[r] 都加上 d。 Q l r,表示询问数列中第 l∼r 个数的和。 对于每个询问,输出一个整数表示答案。 输入格式 第一行两个整数 N,M。 第二行 N 个整数 A[i]。 接下来 M 行表示 M 条指令,每条指令的格式如题目描述所示。 输出格式 对于每个询问,输出一个整数表示答案。 每个答案占一行。 数据范围 1≤N,M≤105, |d|≤1000

7_26的博客 213

区间修改,区间查询

1.题目引入: 题目描述 这是一道模板题. 给定数列$a[1],a[2],\dots,a[n]$,你需要依次进行$Q$个操作,操作有两类: 1 l r x:给定$l,r,x$,对于所有$I\in[l,r]$,将$a[i]$加上$x$(换言之,将$a[l],a[l+1],\dots,a[r]$分别加上$x$); 2 l r:给定$l,r$,求$\sum_{i=l}^ra[i]$的值(换言之,求$a[l]+a[l+1]+\DOTS+a[r]$的值)。 输入格式 第一行包含$2$个正整数$n,Q$,

weixin_52914088的博客 432

树状数组 区间加 区间求和_数据结构之真别多想—树状数组

数据结构之真别多想—树状数组瓶颈如何理解树状数组?这个结构的思想和线段树有些类似:用一个大节点表示一些小节点的信息,进行查询的时候只需要查询一些大节点而不是更多的小节点。最下面的八个方块就代表存入 a 中的八个数,现在都是十进制。他们上面的参差不齐的剩下的方块就代表 a 的上级—— c 数组。很显然看出: c2 管理的是 a1 & a2 ; c4 管理的是 a1 & a2 &amp...

weixin_39871649的博客 474

数据结构一【树状数组】普通、二维、离线树状数组的(单点修改,单点查询,区间修改,区间查询)模板及应用例题总结

学了那么久,再补个学习笔记应该不算晚吧

570

【codevs1080】【树状数组】 单点修改 区间查询

题目描述 Description 一行N个方格,开始每个格子里都有一个整数。现在动态地提出一些问题和修改:提问的形式是求某一个特定的子区间[a,b]中所有元素的和;修改的规则是指定某一个格子x,加上或者减去一个特定的值A。现在要求你能对每个提问作出正确的回答。1≤N<100000,,提问和修改的总数m<10000条。

anantheparty的博客 433
上一篇: 树状数组—求逆序数的个数
下一篇: 二维树状数组(4种操作)
Joined
博客等级 码龄10年 19粉丝 134原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值