首页 > 其他分享 >树状数组和线段树

树状数组和线段树

时间:2023-11-25 20:23:12浏览次数:30  
标签:return 树状 lowbit 线段 ret add long 数组 ll

树状数组:
1.将某一个数加上k
2.求出某区间每一个数的和

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,a[500000+10];
ll lowbit(ll x){return x&(-x);}
void add(ll x,ll k){
	while(x<=n){
		a[x]+=k;
		x+=lowbit(x);
	}
}
ll query(ll x){
	ll ret=0;
	while(x>0){
		ret+=a[x];
		x-=lowbit(x);
	}
	return ret;
}
int main(){
	cin >> n >> m;
	for(ll i=1;i<=n;i++){
		ll temp;
		cin >> temp;
		a[i]+=temp;
		if(i+lowbit(i)<=n)a[i+lowbit(i)]+=a[i];
	}
	for(ll i=1;i<=m;i++){
		ll op,x,y;
		cin >> op >> x >> y;
		if(op==1)add(x,y);
		else cout << query(y)-query(x-1) << endl;
	}
	return 0;
}

树状数组:
1.将某区间每一个数加上k
2.求出某一个数的值

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,a[500000+10],b[500000+10];
ll lowbit(ll x){return x&(-x);}
void add(ll x,ll k){
	while(x<=n){
		a[x]+=k;
		x+=lowbit(x);
	}
}
ll query(ll x){
	ll ret=0;
	while(x>0){
		ret+=a[x];
		x-=lowbit(x);
	}
	return ret;
}
int main(){
	cin >> n >> m;
	for(ll i=1;i<=n;i++)cin >> b[i];
	for(ll i=1;i<=m;i++){
		ll op,x,y,k;
		cin >> op >> x;
		if(op==1){
			cin >> y >> k;
			add(x,k);
			add(y+1,-k);
		}else{
			cout << query(x)+b[x] << endl;
		}
	}
	return 0;
}

树状数组:
1.将某区间每一个数加上k
2.求出某区间每一个数的和

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,a[2][500000+10],b[500000+10];
ll lowbit(ll x){
	return x&(-x);
}
void add(ll type,ll x,ll k){
	while(x<=n){
		a[type][x]+=k;
		x+=lowbit(x);
	}
}
ll query(ll type,ll x){
	ll ret=0;
	while(x>0){
		ret+=a[type][x];
		x-=lowbit(x);
	}
	return ret;
}
int main(){
	cin >> n >> m;
	for(ll i=1;i<=n;i++)cin >> b[i],b[i]+=b[i-1];
	for(ll i=1;i<=m;i++){
		ll op,x,y,k,ans;
		cin >> op >> x >> y;
		if(op==1){
			cin >> k;
			add(0,x,k);
			add(0,y+1,-k);
			add(1,x,k*x);
			add(1,y+1,-k*(y+1));
		}else{
			ans=(y+1)*query(0,y)-query(1,y)-x*query(0,x-1)+query(1,x-1)+b[y]-b[x-1];
			cout << ans << endl;
		}
	}
	return 0;
}

标签:return,树状,lowbit,线段,ret,add,long,数组,ll
From: https://www.cnblogs.com/ningziang/p/17856021.html

相关文章

  • 打印数组(不用方法写)
    publicclassHelloWorld{publicstaticvoidmain(String[]args){//打印数组[11,22,33]int[]arr=newint[]{11,22,33};//arr=[0,0,0]int[]arr2=newint[arr.length];//打印数组arr2for(inti=0;i<arr......
  • 2023-11-25:用go语言,给定一个数组arr,长度为n,表示n个格子的分数,并且这些格子首尾相连, 孩
    2023-11-25:用go语言,给定一个数组arr,长度为n,表示n个格子的分数,并且这些格子首尾相连,孩子不能选相邻的格子,不能回头选,不能选超过一圈,但是孩子可以决定从任何位置开始选,也可以什么都不选。返回孩子能获得的最大分值。1<=n<=10^6,0<=arr[i]<=10^6。来自华为od。来自左程云。答案......
  • 2023-11-25:用go语言,给定一个数组arr,长度为n,表示n个格子的分数,并且这些格子首尾相连, 孩
    2023-11-25:用go语言,给定一个数组arr,长度为n,表示n个格子的分数,并且这些格子首尾相连,孩子不能选相邻的格子,不能回头选,不能选超过一圈,但是孩子可以决定从任何位置开始选,也可以什么都不选。返回孩子能获得的最大分值。1<=n<=10^6,0<=arr[i]<=10^6。来自华为od。来自左程......
  • 打印数组
    publicclasskaobei{publicstaticvoidmain(String[]args){int[]arr={11,22,33};int[]arr2=copy(arr);copy1(arr2);}publicstaticvoidcopy1(int[]arr){System.out.print("[");for(inti=0;i......
  • 一维数组与二维数组的创建、初始化和储存
     一、一维数组1.数组的创建 数组是一组相同类型的集合。数组的创建方式:type_t  arr_name  [contest_n];//type_t是指数组的元素类型//const_n是一个常量表达式,用来指数组的大小介绍一下strlen和sizeof的区别strlen和sizeof没什么关联strlen是求字符串长度的,只能根据字符串......
  • 前端学习笔记202307学习笔记第六十七天-前端面试-对象解构赋值数组特殊处理1
      ......
  • Java零基础入门-数组
    Java零基础入门-数组前言Java是一门面向对象的编程语言,被广泛应用于各个领域。数组是Java编程中最基本也是最重要的数据结构之一,它可以用来存储一组数据,并且方便进行操作和处理。本文将为大家介绍Java数组的基本概念、语法和常见应用场景,帮助初学者快速入门。摘要本文将从以下......
  • JSON 格式的字符串转换回数组
    要将JSON格式的字符串转换回数组,你可以使用JavaScript的JSON.parse方法。这个方法可以将一个JSON字符串解析成JavaScript对象或数组。对于你的字符串,可以这样操作:假设你有一个JSON字符串str,其内容如下:'[{"goodsCode":"ABC1","qty":12.22},{"goodsCode":"ABC2","q......
  • 稀疏数组(精选)
    2023-11-24思路:        将数组转为稀疏数组存入文件/数据库,用的时候再取出来    稀疏数组3列:行,列,值   第一行记录原数组 行数,列数,以及存入的总值publicclassSparseArray_01{publicstaticvoidmain(String[]args){//稀疏数组......
  • 线段树优化建图
    CF786B题意:定义\((u,v,w)\)表示\(u\)向\(v\)连了边权为\(w\)的边。有三种连边操作\((u,v,w)\)\(\foralli\in[l,r],(u,i,w)\)\(\foralli\in[l,r],(i,u,w)\)求最短路。暴力加边是\(O(nm)\)的,考虑优化。可以把图建到线段树上,线段树每个结点向左右儿子连\(w......