洛谷 P3372 线段树1 (树状数组区间修改区间查询)

国密SM4实战:用Python的gmssl库快速实现CBC模式加解密(含文件加密示例) 本文详细介绍了如何使用Python的gmssl库实现国密SM4算法的CBC模式加解密,包括字符串和文件加密的实战示例。通过分步教程和代码示例,帮助开发者快速掌握SM4 CBC加密技术,提升数据安全性,适用于各类需要数据保护的应用场景。 阅读详情

题面

给一个数列,需要满足以下两种操作:
①区间加x
②区间求和

数列规模N<=100000,操作数M<=100000

分析

树状数组基础:logN内区间求和,logN内单点修改
让树状数组维护差分数组,能做到单点求值, 区间修改。
让树状数组可以同时在区间查询+区间修改是对维护量进行变更。

从队友那里问到了如下等式
设di是差分数组,ai是原数组,即
a 1 = d 1 a1=d1 a1=d1
a 2 = d 1 + d 2 a2=d1+d2 a2=d1+d2
a 3 = d 1 + d 2 + d 3 a3=d1+d2+d3 a3=d1+d2+d3
…
a n = d 1 + d 2 + d 3.. + d n an=d1+d2+d3..+dn an=d1+d2+d3..+dn
有如下关系
∑ i = 1 n a i = ( n + 1 ) a n − ∑ i = 1 n i ∗ c i \sum_{i=1}^{n}a_{i}=(n+1)a_{n}-\sum_{i=1}^{n}i*c_{i} ∑i=1n​ai​=(n+1)an​−∑i=1n​i∗ci​
可以自己验证一下

有了这个之后,可知要维护两个树状数组:
①单纯的差分数组,从而求 a n a_{n} an​
②数组 i ∗ c i i*c_{i} i∗ci​,从而能求出后面项的 ∑ \sum ∑

代码

#include "cstdlib"
#include "iostream"
#include<iostream>
#include<vector>
#include<stack>
#include<algorithm>
using namespace std;
#define lowbit(x) (x&(-x))//lowbit操作:x&(-x),取到最低位的1及其后的0
class Binary_Indexed_Tree {
private:
	const static int MAXN = 100005;
	long long C[MAXN];
public:
	int N;//一共1~n
	void add(int p, long long v)//单点加
	{
		while (p <= N)
		{
			C[p] += v;
			p += lowbit(p);
		}
	}
	long long query(int p)//查询从1到p的前缀和
	{
		long long ans = 0;
		while (p)
		{
			ans += C[p];
			p -= lowbit(p);
		}
		return ans;
	}
}diff, idiff;//维护差分 和 i*差分di
class BIT_chunk {
public:
	void add(int l, int r, long long v)//[l,r]内加v,即改变两端的差分值(两个单点修改)
	{
		diff.add(l, v);
		idiff.add(l, l * v);
		if (r < diff.N) { diff.add(r + 1, -v); idiff.add(r + 1, -v * (r + 1)); }
	}
	long long query(int l, int r)//根据公式,对两个差分分别计算区间和
	{
		return (r + 1) * diff.query(r) - idiff.query(r) - l * diff.query(l - 1) + idiff.query(l - 1);
	}
	void create(int *A, int s,int n)//数组,起点,长度
	{
		diff.N = n;
		idiff.N = n;
		diff.add(1, A[s]);
		idiff.add(1, 1 * A[s]);
		for (int i = s+1,j=2; i <= n; i++,j++)
		{
			diff.add(i, A[i] - A[i - 1]);
			idiff.add(i, j * (A[i] - A[i - 1]));
		}
	}
}BIT;
int arr[100005];
int main()
{
	ios::sync_with_stdio(false);
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i++)cin >> arr[i];
	BIT.create(arr, 1, n);
	int op, k;
	long long x, y;
	for (int i = 0; i < m; i++)
	{
		cin >> op >> x >> y;
		if (op == 1) { cin >> k;BIT.add(x, y, k); }
		else { cout << BIT.query(x, y) << endl; }
	}
	return 0;
}



洛谷 - 线段树详解 1 (超详细版) 本文介绍了线段树的基本概念及其在区间修改与查询中的应用。文章以洛谷P3372模板题为例,详细讲解了线段树的实现过程,包括建树、更新、区间修改和查询等核心操作。通过懒标记技术优化区间修改效率,并提供了完整的C++代码实现。该题要求实现区间加法和区间求和两种操作,展示了线段树处理这类问题的实用性。适合算法初学者学习线段树的基本原理和实现方法。 阅读详情

相关推荐

题解:洛谷 P3372 【模板】线段树 1

等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。第二行包含 n 个用空格分隔的整数,其中第 i 个数字表示数列第 i 项的初始值。第一行包含两个整数 n,m,分别表示该数列数字的个数和操作的总个数。输出包含若干行整数,即为所有操作 2 的结果。本文分享的必刷题目是从。#普及+# #线段树#

团爸讲算法 558

线段树洛谷题单

Limit の线段树题单 - 题单 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 线段树题单 线段树入门 P3372 【模板】线段树 1 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 区间修改+区间求和 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long l

weixin_45360119的博客 861

SAP VC实战:用CU01和CS02搞定BOM里的‘智能’对象相关性(附语法避坑指南)

在工业制造领域,产品配置的复杂性往往超出想象。想象一下,当客户需要定制一台工业设备时,可能有数百种配置选项相互影响——从基础材质到动力系统,从控制模块到安全装置。如何在SAP系统中优雅地管理这种复杂性?对象相关性(Object Dependencies)就是解决这一挑战的利器。

weixin_42524824的博客 467

P3372 【模板】线段树 1

题解

disliked的博客 147

中国裁判文书网案例批量爬取

本文介绍了某法院网站数据采集的技术研究过程,主要包含JS逆向分析和数据解密方法。通过开发者工具分析发现页面数据经过加密处理,重点研究了ciphertext等加密参数的生成逻辑。文章详细记录了定位加密函数、扣取加密代码、解密数据处理的全流程,并验证了解密方法的有效性。研究过程中强调了技术使用的法律边界,明确声明仅用于合法技术研究,禁止任何非法数据爬取行为。最终实现了加密数据的成功解密,并解释了各请求参数的作用,为后续数据清洗和存储奠定了基础。

2303_80825459的博客 815

ffmpeg 4.4 cenc-aes-ctr 加解密 MP4 工程性质分析

ffmpeg 4.4 cenc-aes-ctr 加解密 MP4 工程性质分析

Dream_Dynasty的博客 3045

P3372 模板 【线段树】1

题目描述 如题,已知一个数列,你需要进行下面两种操作: 将某区间每一个数加上 kkk。 求出某区间每一个数的和。 输入格式 第一行包含两个整数 n,mn, mn,m,分别表示该数列数字的个数和操作的总个数。 第二行包含 nnn 个用空格分隔的整数,其中第 iii 个数字表示数列第 iii 项的初始值。 接下来 mmm 行每行包含 333 或 444 个整数,表示一个操作,具体如下: 1 x y k:将区间 [x,y][x, y][x,y] 内每个数加上 kkk。 2 x y:输出区间 [x,y][x, y

ln2037的博客 323

centos+apache+subversion+LDAP

yum install subversion 报错:[Errno 14] HTTP Error 416 - Requested Range Not Satisfiable 正在尝试其它镜像。 zaici

qq_41566366的博客 1544

洛谷P3372 【模板】线段树 1

题目已经说得很清楚了,就是线段树模板。由于需要区间修改,我们需要用到。第二行包含 𝑛 个用空格分隔的整数,其中第 𝑖 个数字表示数列第 𝑖 项的初始值。第一行包含两个整数 𝑛,𝑚,分别表示该数列数字的个数和操作的总个数。输出包含若干行整数,即为所有操作 2 的结果。保证任意时刻数列中所有元素的绝对值之和 ≤。对于 30% 的数据:𝑛≤8,𝑚≤10。对于 100%的数据:1≤𝑛,𝑚≤。对于 70% 的数据:𝑛≤。

yjfyjfyjf54188的博客 559

12、硬件工程师笔试面试——MOS管(2025版本)

在设计和测试过程中,可以参考相关的EMC测试标准和指南,如CE认证EMC电磁兼容测试介绍 和电磁兼容性(EMC)测试方法与整改指南 ,以及电磁兼容(EMC)的标准与测试内容 ,来确保MOSFET的EMC性能符合行业标准。在高频应用中,MOSFET的开关速度对电路的整体性能至关重要。是一款高电压同步N沟道MOSFET驱动器,具有自举电源电压至114V的能力,宽VCC电压范围,自适应贯通保护功能,以及高达1.4A的峰值顶端栅极上拉电流,适用于分布式电源架构、汽车电源、高密度电源模块和电信系统等应用。

XU157303764的博客 7090

DBC中如何实现报文传输类型属性的配置

AUTOSAR中CAN报文的传输类型主要有三种,周期型,事件型和混合型。周期型:按固定时间间隔自动发送,无需额外的触发条件。事件型:当信号值变化或满足内部条件时立即发送。混合型:默认按周期发送,但事件触发时可提前发送。

sunchengl的博客 303

洛谷 P3372 【模板】线段树 1

本文介绍了使用线段树解决区间修改和区间查询问题的思路。重点讲解了线段树中的延迟标记(Lazy Tag)机制,通过标记下传(pushDown)和标记更新(addTag)来提高效率。文章提供了详细的代码实现,包括建树、区间修改和查询操作,并强调了long long类型处理大数据范围的必要性。树状数组解法作为补充也简要提及。该解法时间复杂度为O(log n),适合处理大规模数据。核心在于延迟标记的巧妙应用,既保证了正确性又优化了性能。

君义NOIP的博客 1227

【QT/C++】事件过滤器之基于重写 eventFilter 方法的多种常见应用场景及实现

Qt事件过滤器通过重写eventFilter方法实现多种实用功能:1)鼠标事件处理(点击全选文本、禁用滚轮、悬停提示);2)键盘事件处理(输入内容限制、快捷键提交);3)焦点事件处理(自动弹出下拉框、实时验证);4)绘图事件处理(自定义控件绘制);5)窗口事件处理(防止意外关闭、尺寸限制)。事件过滤器提供非侵入式的事件处理方案,相比传统子类化方式更灵活,通过installEventFilter安装到目标控件即可实现各种交互增强功能。

yuhuasheng1997的博客 1483

区间修改+区间查询【树状数组实现,超越线段树】

参考文章:https://blog.youkuaiyun.com/MM__1997/article/details/76691744 以之前做过的一个线段树模板题为例:洛谷 P3372 线段树1 如何用树状数组实现 区间修改+区间查询 呢?推导数学公式: sum[n] = a[1] + a[2] +…+ a[n] = (d[1]) + (d[1]+d[2]) +…+ (d[1]+d[2]+…+d[n]) = ...

nefu_ljw的博客 1296

Day 01: 与Python的第一次亲密接触

环境搭建 、第一个程序 Hello, World!、以及Python之禅 (The Zen of Python) 的解读。

杨小扩的博客 220

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【数据结构】平替线段树:树状数组结合差分数组实现区间修改与查询(洛谷P3368 P3372 附C++代码)

而我们树状数组查询的性质就是查询出来前缀和,刚好符合我们公式里的和的查询。据此我们就可以完美地利用树状数组来实现区间修改和区间查询了!我给出如下代码和注释,方便大家阅读和理解。

h_a_o777oah的博客 325

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

树状数组详解(区间修改和区间查询)

前置芝士 单点修改和区间查询 区间修改和单点查询 引入(洛谷 P3372 【模板】线段树 1) 已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上 kkk。 2.求出某区间每一个数的和。 这是线段树的模板题,然而我们要用树状数组去做它! 可以看出这题就像是 单点修改区间查询 和 区间修改单点查询 的升级版,好,那我们就顺着这两道题的思路继续走。 区间修改和区间查询 我们还是利用差分,可以得: ∑i=1nai=∑i=1n∑j=1ibj=n×b1+(n−1)×b2+...+bn=n×∑i=1n

Wu_while的博客 3656

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

支持区间修改和区间查询的树状数组

题目洛谷P3372 【模板】线段树 1 已知一个数列,你需要进行下面两种操作: 将某区间每一个数加上 k 求出某区间每一个数的和 树状数组解法 设tree[i]=a[i]-a[i-1](差分) 易得 tree[1]+tree[2]+……+tree[i]=a[i] 则 sum(1,r,a) = a[1]+a[2]+……+a[r-1]+a[r] = tree[1]+(tree[1]+tree[2])+……+(tree[1]+……+tree[r]) = (tree[1]*(r))+(tree[2]*(r-.

书伯的博客 276

洛谷P3372 【模板】线段树 1(树状数组)

摘要:本文介绍了一个使用树状数组解决区间修改和查询问题的算法。给定n个数的序列和m个操作,操作包括将区间[x,y]每个数加k,以及查询区间[x,y]的和。采用差分思想,维护两个树状数组:tree_1存储差分值d[i],tree_2存储d[i]×(i-1)。通过lowbit函数实现高效更新,利用前缀和相减得到区间和。算法时间复杂度为O(mlogn),适用于大规模数据。代码实现包括初始化、区间修改和查询功能,注意使用long long防止数据溢出。

2401_87622134的博客 481

【算法】线段树

几乎是算法竞赛最常用的数据结构了,它主要用于(要求满足结合律)。与树状数组相比,它可以实现的,还可以同时(加、乘),更具通用性。如题,已知一个数列,你需要进行下面两种操作:1.将某区间每一个数加上x2.求出某区间每一个数的和第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。

weixin_73366312的博客 1808

【杂】树状数组的区修区查

灰藏完整的推导过程!!!

xiaolongmeiya的博客 678

【模板】树状数组 区间修改,区间求和 (模板题:洛谷P3372线段树1)

题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。 接下来M行每行包含3或4个整数,表示一个操作,具体如下: 操作1: 格式

Dance Of Faith 607

洛谷P3372 【模板】线段树 1题解

洛谷P3372 【模板】线段树 1题解

weixin_54657171的博客 598

洛谷题单 206【数据结构2-2】线段树与树状数组

文章目录P3374 【模板】树状数组 1P3368 【模板】树状数组 2 P3374 【模板】树状数组 1 单点增加和区间查询 #include <bits/stdc++.h> using namespace std; const int N = 1e6 + 5; typedef long long ll; int n, m, a[N]; // a 为原数组 ll c[N]; // c 为树状数组 // 返回x的二进制数下最小2的次幂 int lowbit(int x) { retu

默的博客 391

树状数组 区间修改区间查询

http://codevs.cn/problem/1082/ 在这道题因为数据类型卡了我1个多小时之后,我终于把它干掉了(洛谷3372也可以用这道题的代码过,复制过去改一下读入顺序就行,目测codevs的数据比较毒瘤) 树状数组 区间修改+区间查询 实在是喜欢树状数组啊!好理解,更重要是好写啊!这次写写区间修改区间查询哈 首先还是上次区间修改单点查询用过的差分思想,我们先搞一个c数组作为差...

weiya040214的博客 2716
上一篇: 洛谷P3374 树状数组 1
下一篇: 洛谷P1801 黑匣子
engineoid
博客等级 码龄10年 6粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值