小陶的疑惑2

题目描述

解决了助教给出的第一个问题后,小陶对数据结构的兴趣被点燃了,他央求助教给他出了第二个问题:

给出一个有n个元素的序列(n<=200000),进行m次操作,操作有两种类型:

1 x y c: 给都加上c

2 x:输出的值

输入格式

第一行两个整数n,m

接下来m行,每行2个或4个整数,表示一个操作,格式见题面

输出格式

对于每个操作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
数据范围与提示

对于30%的数据: n<=5000

对于60%的数据: n<=30000

对于100%的数据: n<=200000

一些想法

这道题依旧用树状数组做。

但是他用到了区间修改和的思想,具体看上一篇。

这次的树状数组是差分数组,差分数组是用当前数减上一个数得来的。

代码解析:输入序列的每一个数,在第 i 个位置增加当前数减上一个数的值,也就是将当前数减上一个数的值放进树状数组,然后上一个数更新为当前数(为下次相减提供数据)。

然后循环输入操作,如果操作类型是 1,输入左边界、右边界和增加的值,然后左边界到 n 增加,右边界加一到 n 减,因为要求的是左边界到右边界,但是修改函数是某个数到最后一个值都增加,这就不符合题目要求,所以我们先将左边界到 n 照常增加,然后将右边界后一个值负增加,这样就只会增加左边界到右边界的数,右边界后面的数会被抵消,这样就能达到目的了。

如果是查询操作,这个直接查询第 x 个数就行了,直接调用函数输出就行了。

自定义函数部分:

lowbit 函数:用位运算找 x 二进制的最后一个 1 。树状数组的所有操作都基于 lowbit 实现区间划分。

查询函数:查询 x,然后只要 x 大于 0(没有超出范围),然后将 x 不断减小(减自己的lowbit),跳转到前一个区间,将数增加。(简单来说就是分解,将当前区间不断分解成多个小区间),查询 a[x] 也就是 x 在树状数组中的表示的数,直接调用就行了。

修改函数:将第 x 个数增加 y ,因为前面的点有变化,所以包含这个点的在范围内的所有数都要跟着变化,因为父节点要随着子节点的变化而变化,所以每次增加自己的 lowbit ,也就是不断往后一个区间,直到达到边界,然后每一个区间都增加指定值。

AC代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
long long n,m,c[200005];
int lowbit(int x){
	return x&-x;
}
void zs(int x,int y){
	for(;x<=n;x+=lowbit(x)) c[x]+=y;
}
int sm(int x){
	int sum=0;
	for(;x>0;x-=lowbit(x)) sum+=c[x];
	return sum;
} 
int main(){
	cin>>n>>m;
	int r,l,x,op,last,now;
	for(int i=1;i<=n;i++){
		cin>>now;
		zs(i,now-last);
		last=now;
	}
	for(int i=1;i<=m;i++){
		cin>>op;
		if(op==1){
			cin>>l>>r>>x;
			zs(l,x);
			zs(r+1,-x);
		}
		if(op==2){
			cin>>x;
			cout<<sm(x)<<endl;
		}
	}
	return 0;
}
相关推荐
王老师青少年编程19 分钟前
csp信奥赛C++高频考点专项训练之前缀和&差分 --【一维前缀和】:求区间和
c++·前缀和·csp·高频考点·信奥赛·求和区间和
kyle~1 小时前
机器人时间链路---工程流程示例
c++·3d·机器人·ros2
清木!2 小时前
排序算法比较
数据结构·算法·排序算法
汉克老师3 小时前
GESP6级C++考试语法知识(十七、数据结构(三、认识队列 Queue))
数据结构·c++·队列·gesp6级·gesp六级·数组模拟队列
JavaWeb学起来3 小时前
Python学习教程(六)数据结构List(列表)
数据结构·python·python基础·python教程
j_xxx404_4 小时前
Linux进程信号捕捉与操作系统运行本质深度解析
linux·运维·服务器·开发语言·c++·人工智能·ai
vx-程序开发5 小时前
基于机器学习的动漫可视化系统的设计与实现-计算机毕业设计源码08339
java·c++·spring boot·python·spring·django·php
啊董dong6 小时前
noi-2026年5月12号小测验
数据结构·c++·算法
南境十里·墨染春水7 小时前
数据结构 —— 链表
数据结构·链表
咩咦7 小时前
C++学习笔记24:构造函数初始化列表
c++·学习笔记·类和对象·构造函数·初始化列表·const引用