线段树+单点修改

洛谷P3347

已知一个数列,你需要进行下面两种操作:

1.将某一个数加上x

2.求出某区间每一个数的和

输入输出格式

输入格式:

 

第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。

第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。

接下来M行每行包含3个整数,表示一个操作,具体如下:

操作1: 格式:1 x k 含义:将第x个数加上k

操作2: 格式:2 x y 含义:输出区间[x,y]内每个数的和

 

输出格式:

 

输出包含若干行整数,即为所有操作2的结果。

 

输入输出样例

输入样例#1: 复制

5 5
1 5 4 2 3
1 1 3
2 2 5
1 3 -1
1 4 2
2 1 4

输出样例#1: 复制

14
16

说明

时空限制:1000ms,128M

数据规模:

对于30%的数据:N<=8,M<=10

对于70%的数据:N<=10000,M<=10000

对于100%的数据:N<=500000,M<=500000

样例说明:

故输出结果14、16

 

#include<bits/stdc++.h>
using namespace std;
int n,m,d[501000]; 
struct Node{
	int l,r,v,sum;//lr是区间的左右边界,v是这个节点的值,sum是这个区间的和 
}t[501000*4];//注意:这里为什么要开四倍空间
void build(int k,int l,int r){ //建立线段树 
	t[k].l=l;
	t[k].r=r; 
	if(l==r){
		t[k].sum=t[k].v=d[l];
		return ;
	}
	int mid=(l+r)/2;
	build(k*2,l,mid);
	build(k*2+1,mid+1,r);//思考:为什么左子树的编号是k*2,右子树的编号是k*2+1; 
	t[k].sum=t[k*2].sum+t[k*2+1].sum;
} //建立线段树
void update(int k,int pos,int w){  
	if(t[k].l==t[k].r&&t[k].l==pos){//如果当前节点是叶节点  并且当前节点等于目标位置 
		t[k].v+=w;
		t[k].sum+=w;
		return ;
	} 
	int mid=(t[k].l+t[k].r)/2;
	
	if(pos<=mid) update(k*2,pos,w);//如果目标位置在左子树中 
	if(mid<pos)  update(k*2+1,pos,w); //如果目标位置在右子树中
	 
	t[k].sum=t[k*2].sum+t[k*2+1].sum;//子树中的节点改变   那么相应的改变父亲节点的区间和 
} 
int ask(int k,int l,int r){
	if(l<=t[k].l&&t[k].r<=r){//如果当前区间在目标区间内部 
		return t[k].sum;
	}
	int mid=(t[k].l+t[k].r)/2,ans=0;
	 
	if(l<=mid)ans+=ask(k*2,l,r);//左子树中  包含目标区间的 点 
	if(mid<r)ans+=ask(k*2+1,l,r);//右子树中  包含目标区间的  点 
	return ans;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%d",&d[i]);//输入数据
		
	build(1,1,n);//建立存放n个数据的线段树 
	
	for(int op,x,y,i=1;i<=m;i++){
		scanf("%d%d%d",&op,&x,&y);
		if(op==1){//将第x个数加上y 
			update(1,x,y); 
		}
		if(op==2){
			printf("%d\n",ask(1,x,y));
		}
	}
	return 0;
} 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本系统实现一个物流管理系统。具体功能描述如下: 1. 系统其它信息管理:主要是针对系统的其他的信息进行管理,实现了系统的模块化的管理,系统的框架建设等信息的管理,具有系统的整合性功能的建立,支撑起整个系统的平台建设。 2. 采购管理:系统采购管理,是本平台的一个初始化工作的登记,通过系统用户的用料商品的采购,进行登记管理,能够让平台最初的信息登记做到信息化的统计,方便用户在后期对采购商品的查看管理。 3. 库存管理:库存管理主要是针对采购的物料信息进行入库和出库的管理,方便了用户对物料的登记管理。 4. 供应商管理:供应商信息的管理和登记,是本系统的第三方用户相关信息的登记功能,通过供应商信息的登记,能够方便企业对供应商的查找,快速进货。 5. 配送运输:配送运输是物流管理平台管理物流信息的一个重要的功能点,通过配送运输机制的建立,就能更好地对物流信息进行管理,进行物流信息一体化的建设工作。 6. 出库入库管理:出库入库的信息管理,是本系统建设的一个重要的功能,将采购的物料信息,进行出库入库的登记,入库后,可以新增物料信息的数量,并在出库后,进行数量的减少。 7. 单据查询:针对客户单据的信息进行管理,能够针对客户的物料结算单据,进行单据的查询和登记管理,方便企业对客户的单据,进行查询查看。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值