首页 > 其他分享 >基础树状数组

基础树状数组

时间:2022-11-16 14:39:05浏览次数:57  
标签:ch 树状 int ll 基础 while 数组 区间

树状数组:

利用数组下标的二进制关系,构造一种类似于树形的结构,有点像一个变成树形的前缀和
可以实现单点修改、区间修改、区间查询等操作
2的整数n次幂的位置就是表示该位置及之前所有数之和
在2的整数n次幂上加上小于等于2的n次幂的2的k次幂的数,也表示2^n +1 ··· 2^n + 2^k区间内的整数和
故查询时区间拼凑即可 logn次
lowbit(x):取出x的最低位的一,区间拼凑时,拼一即可
example:(二进制)
1
10
11
100
101
110
111
1000
由一的数量以及位置决定该点存储的区间
查询区间和时,只需将对应的一(基本是log个)的位置所对应的值加起来即可,利用 +lowbit
区间修改时,需要修改本身位置的同时,再修改对应的相关区间,利用 -lowbit

My_Code:

//树状数组1 luoguP3374
#include<bits/stdc++.h>
using namespace std;

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

int update(int x,int k) {
    
	while(x<=n) {

		tree[x]+=k;
		x+=lowbit(x);
		
	}

}

int query(int x){
	
	int ans=0;
	while(x){
		
		ans+=tree[i];
		x-=lowbit(x);
		
	}
	return ans;
	
}

int n;
int tree[100001]; 

int main() {
	
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		
		scanf("%d",&tree[i]);
		
	}
	for(int i=1;i<=m;i++){
		
		int op;
		scanf("%d",&op);
		if(op==1){
			
			int x,k;
			scanf("%d%d",&x,&k);
			update(x,k);
			
		} 
		if(op==2){
			
			int l,r;
			scanf("%d%d",&l,&r);
			printf("%d\n",query(r)-query(x-1));
			
		} 
		
	} 
	
	return 0;
}
//树状数组1 luoguP3368 
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const ll N=1e6+10;

ll read(){
	
	ll x=0,f=1;
	char ch=getchar();
	while(ch<48||ch>57){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>=48&&ch<=57){
		x=(x<<3)+(x<<1)+(ch^48);
		ch=getchar();
	}
	return x*f;
	
}

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

ll a[N],b[N],c[N],n,m;
void update(ll x,ll d){
	
	ll p=x;
	while(x<=n){
		
		b[x]+=d;
		c[x]+=(p-1)*d;
		x+=lowbit(x);
		
	}
	
}

ll sum(ll x){
	
	ll ans=0,p=x;
	while(x){
		
		ans+=p*b[x]-c[x];
		x-=lowbit(x);
		
	}
	return ans;
	
}

int main() {
	
	n=read();
	m=read();
	
	for(ll i=1;i<=n;i++){
		
		a[i]=read();
		update(i,a[i]-a[i-1]);
		
	}
	
	for(ll i=1;i<=m;i++){
		
		ll op=read();
		if(op==1) {
			
			ll x=read(),y=read(),k=read();
			update(x,k);
			update(y+1,-k);
			
		}
		else {
			
			ll x=read();
			printf("%lld\n",sum(x)-sum(x-1));
			
		}
		
	}
	
	return 0;
}
//线段树1 luoguP3372  树状数组写法
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const ll N=1e6+10;

ll read(){
	
	ll x=0,f=1;
	char ch=getchar();
	while(ch<48||ch>57){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>=48&&ch<=57){
		x=(x<<3)+(x<<1)+(ch^48);
		ch=getchar();
	}
	return x*f;
	
}

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

ll a[N],b[N],c[N],n,m;
void update(ll x,ll d){
	
	ll p=x;
	while(x<=n){
		
		b[x]+=d;
		c[x]+=(p-1)*d;
		x+=lowbit(x);
		
	}
	
}

ll sum(ll x){
	
	ll ans=0,p=x;
	while(x){
		
		ans+=p*b[x]-c[x];
		x-=lowbit(x);
		
	}
	return ans;
	
}

int main() {
	
	n=read();
	m=read();
	
	for(ll i=1;i<=n;i++){
		
		a[i]=read();
		update(i,a[i]-a[i-1]);
		
	}
	
	for(ll i=1;i<=m;i++){
		
		ll op=read();
		if(op==1) {
			
			ll x=read(),y=read(),k=read();
			update(x,k);
			update(y+1,-k);
			
		}
		else {
			
			ll x=read(),y=read();
			printf("%lld\n",sum(y)-sum(x-1));
			
		}
		
	}
	
	return 0;
}

标签:ch,树状,int,ll,基础,while,数组,区间
From: https://www.cnblogs.com/Diamondan/p/16895781.html

相关文章

  • 测试基础内容
    软件的测试对象程序+文档+数据 什么是软件测试使用人工和自动手段来运行或测试某个系统的过程,其目的在于检验它是否满足规定的需求,并找出被测系统与预期结果之间的差......
  • 08基础元器件-热电偶、热敏电阻
    一、热电偶工作原理如果两种不同成分的均质导体形成回路,直接测温端叫测量端,接线端子端叫参比端,当两端存在温差时,就会在回路中产生电流,那么两端之间就会存在Seebeck热电势,......
  • 「Java数据结构」手撕数组队列及环形数组队列。
    目录​​一、队列​​​​1、基本介绍​​​​2、示意图​​​​3、队列的特点​​​​二、数组模拟队列​​​​1、数组队列初始化​​​​2、判断方法​​​​3、增删改查......
  • Day6-3 多维数组
    二维数组多位数字可以看称是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组二维数组: inta[][]=newint[2][5] 以上的二维数......
  • 内网穿透方案&FRP内网穿透实战(基础版)
    目录前言方案方案1:公网方案2:第三方内网穿透软件花生壳cpolar方案3:云服务器做反向代理FRP简介FRP资源FRP原理FRP配置教程之SSH前期准备服务器配置......
  • CPU乱序执行基础 —— Tomasulo算法及执行过程
    IBM360/91浮点单元最先实现Tomasulo算法从而允许乱序执行。360体系只有4个双精度浮点寄存器,限制了编译器调度的有效性。而且,IBM360/91的访存和浮点延迟都很长,如果顺序执......
  • 【Python基础】科学计算库Scipy简易入门
    0.导语Scipy是一个用于数学、科学、工程领域的常用软件包,可以处理插值、积分、优化、图像处理、常微分方程数值解的求解、信号处理等问题。它用于有效计算Numpy矩阵,使Numpy......
  • Linux 下Socket编程基础(转)
    1、 引言Linux的兴起可以说是Internet创造的一个奇迹。Linux作为一个完全开放其原代码的免费的自由软件,兼容了各种UNIX标准(如POSIX、UNIX System V 和 BSD UNIX ......
  • Day6-2 数组的使用:for,for-each循环,作为方法参数,作为返回值
    数组的使用普通For循环For-Each循环数组做方法入参数组做返回值 packagecom.kuang.array;​//for-each循环publicclassArrayDemo04{publicstatic......
  • 零基础抖音视频教程全套|短视频无人直播带货技术课程+视频素材和软件工具
    不可否认,抖音已成为当今最受欢迎的社交媒体平台之一。曾经是一个社交媒体平台,青少年可以在其中提出舞蹈套路,同时对他们最喜欢的歌曲进行口型同步,现已成为主流视频世界,其中......