首页 > 其他分享 >线段树【区间求和】

线段树【区间求和】

时间:2023-09-10 16:33:07浏览次数:36  
标签:求和 线段 tr mid int maxn 区间 sum

#include<bits/stdc++.h>
#define maxn 500005
using namespace std;
int n,m;
int a[maxn]; 


struct node{
	int l,r,sum;
};

node tr[4*maxn];


void build(int l,int r,int p)
{
	//对[l,r]区间建立线段树,当前根的编号为p 
	int mid = (l+r)>>1;
	//int mid = s+((t-s)>>1);
	//第一种可能会超出int范围 
	tr[p].l = l;tr[p].r = r;
	if(l==r)
	{
		tr[p].sum = a[l];
		return;
	}
	//递归左右区间建树 
	build(l,mid,p<<1);
	//build(l,mid,p*2)
	build(mid+1,r,p<<1|1);
	//build(m+1,t,p*2+1)
	tr[p].sum = tr[p<<1].sum +tr[p<<1|1].sum;
}


void add(int x,int y,int p)
{
	if(tr[p].l == tr[p].r)
	{
		tr[p].sum += y;return;
	}
	int mid = (tr[p].l + tr[p].r)>>1;
	if(x<=mid)add(x,y,p<<1);
	else add(x,y,p<<1|1);
	tr[p].sum = tr[p<<1].sum +tr[p<<1|1].sum;
}


int getsum(int l,int r,int p)
{
	if(l<=tr[p].l&&r>=tr[p].r)
		return tr[p].sum;
	//当前区间为询问区间的子集时直接返回当前区间的和 
	if(l>tr[p].r||r<tr[p].l) 
		return 0;
	int mid = (tr[p].l + tr[p].r)>>1;
	
	return lala(l,r,p<<1)+lala(l,r,p<<1|1);
	//递归查询左右儿子的交集 
}

int main()
{
	cin>>n>>m;
	for(int i = 1;i<= n;i++)cin>>a[i];
	build(1,n,1);
	for(int i = 1;i<=m;i++)
	{
		int b,x,y;
		cin>>b;
		if(b==1)
		{
			cin>>x>>y;
			add(x,y,1);
		}
		int l,r;
		if(b==2)
		{
			cin>>l>>r;
			cout<<getsum(l,r,1)<<endl;
		}
	}
}

标签:求和,线段,tr,mid,int,maxn,区间,sum
From: https://www.cnblogs.com/narcissusyl/p/17691437.html

相关文章

  • 6574: 最大数 线段树/单点加/求区间最大值
    描述 给定一个正整数数列a1,a2,a3,⋯,an,每一个数都在0~p–1之间。可以对这列数进行两种操作:添加操作:向序列后添加一个数,序列长度变成n+1;询问操作:询问这个序列中最后L个数中最大的数是多少。程序运行的最开始,整数序列为空。写一个程序,读入操作的序列,并输出询问操作的......
  • 线段树的一种简单实现
    发现之前没有整理过线段树的代码,填一下坑。intArray[maxn];classSegmentTree{public:SegmentTree*BuildTree(constintL,constintR){SegmentTree*Node=newSegmentTree;Node->l=L,Node->r=R;Node->Tag=0;if(L==R){Node->LeftSon=Node-......
  • Java泛型对象在http请求和响应对象中的封装
    Java泛型对象在http请求和响应对象中的封装publicclassMySystemBaseResVo<T>{//注意:类的后面需要带上<T>,否则数据无法封装privateStringerr_no;privateStringerr_tips;privateTdata;publicStringgetErr_no(){returnerr_no;}......
  • python flask有像Spring AOP一样 捕获记录操作过程请求和返回
    在PythonFlask中,你可以使用装饰器(decorators)或中间件(middlewares)来实现类似SpringAOP的日志记录功能,以捕获和记录操作过程的请求和返回。一种常见的方法是使用装饰器来包装路由处理函数,在函数执行前后记录相关信息:```pythonfromfunctoolsimportwrapsfromflaskimport......
  • 线段树
    树状数组是个好东西,写起来也相对好看。但是操作比较局限,区间修改就掉回\(O(nlogn)\),那还不如\(O(n)\)。线段树完美的解决问题。线段树,也可以理解的一堆线段组成的树。大致如上,有一线段\([l,r]\)当\(l\ner\)可化为\([l,mid]\),\([mid+1,r]\)PS:\(mid=(l+r......
  • 线段树进阶
    普通线段树核心在于上传标记(pushup)和下传标记(pushdown)以及懒标记的设计。P3373【模板】线段树2维护一个加法标记和乘法标记。下传标记时,将乘法标记更新加法标记。标记下传实现voidpushdown(intu,intl,intr){intmid=l+r>>1;tr[u<<1].val=(tr[u<<1].val*tr[......
  • Codeforces Round 406 (Div. 2) D. Legacy 线段树优化建图
    传送门题目大意:给定n个点,m个操作,和起点s。其中n和q大于等于1小于等于1e5,s大于等于1小于等于n其中m个操作有三种情况:  1.输入1uvval表示从u号点向v号点连一个权值为val的有向边,其中1<=u<=n,1<=v<=n,1<=val<=1e9  2.输入2ulrval表示从u号点......
  • 使用 MYSQL 对列中特定范围的数字求和
    使用MySQL对列中特定范围的数字求和,可以使用SQL的SUM()函数结合WHERE子句来实现。以下是一个示例:SELECTSUM(column_name)ASsum_resultFROMtable_nameWHEREcolumn_name>=start_valueANDcolumn_name<=end_value;在上述代码中,将column_name替换为要计算求和的......
  • 吉司机线段树
    一、区间历史最值以区间历史最大值为例。首先,相应地,设\(maxb\)表示一个节点的区间历史最大值。为了更新一个区间的子区间,再设一个\(tag2\),表示\(tag1\)从上次\(push\_down\)以后到现在达到过的最大值。\(code:\)voidpush_up(intu){p[u].w=p[u<<1].w+p[u<<1|1].w......
  • 李超线段树学习笔记
    李超线段树学习笔记P4097【模板】李超线段树/[HEOI2013]Segment题意要求在平面直角坐标系下维护两个操作:在平面上加入一条线段。记第\(i\)条被插入的线段的标号为\(i\)。给定一个数\(k\),询问与直线\(x=k\)相交的线段中,交点纵坐标最大的线段的编号。做法首先,......