洛谷 P3374 【模板】树状数组 1

本文分享了一次树状数组的学习经历,从初学者的角度出发,详细解析了树状数组的基本概念、实现原理及代码模板。文章通过实际操作,揭示了树状数组并非想象中那般难以掌握,鼓励读者跟随作者的步伐,逐步攻克这一数据结构难题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

吼吼吼

今天学习了树状数组
前一段时间没有认真看别人的讲解,
所以一直觉得很难,
今天仔细学了学,发现好像没那么难呢!


习题抽空做


想学习树状数组的同学可以在洛谷此题第一篇题解上学习,非常容易理解(看我多好,链接都给大家了

不多说,上模板!

#include<iostream>
#include<cstdio>
using namespace std;
int n,m,a,w,x,y;
int tree[5000010]; 
int lowbit(int x)      //去掉从右往左数第一个1
{
	return x&-x;
}
void add(int i,int k)     //单点修改
{
	while(i<=n)
	 {
	 	tree[i]+=k;
	 	i+=lowbit(i);
	 }
}
int sum(int x)         //区间求和
{
	int ans=0;
	while(x!=0)
	 {
	 	ans+=tree[x];
	 	x-=lowbit(x);
	 }
	return ans;
}
int main()
{
	cin>>n>>m;
	for(int i=1; i<=n; i++)
	 {
	 	scanf("%d",&a);
	 	add(i,a);
	 }
	for(int i=1; i<=m; i++)
	 {
	 	scanf("%d%d%d",&w,&x,&y);
	 	if(w==1)
	 	  add(x,y);
	 	else if(w==2)
	 	  cout<<sum(y)-sum(x-1)<<endl;   //巧妙之处,很像前缀和的求法
	 }
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值