树状数组基本操作

前言

树状数组比线段树好写很多,虽然功能少点,但是有的时候已经可以满足一般题目的要求。

推荐一篇博客:https://bestsort.cn/2019/04/26/195/

我就是看着这个学的。

正文

第一节

这一节要实现的是单点修改和区间查询。

核心就是lowbit

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

单点修改和区间查询都是基于lowbit来实现的。

单点修改代码
void update(int x,int y){//把第x个元素增加y
    for(int i=x;i<=n;i+=lowbit(i))//此处的n是你的元素的数量。
        c[i] += y;
}

区间查询代码
int getsum(int a)
{
	int ans=0;
	for(int i=a;i;i-=lowbit(i))
		ans+=q[i];
	return ans;
}

第二节

这节要实现的是区间修改和单点查询。

树状数组模板题2
#include<bits/stdc++.h>
using namespace std;
int q[500005],w[500005],n,m;
int lowbit(int a){return a&(-a);}
void add(int x,int y)
{
	for(int i=x;i<=n;i+=lowbit(i))
		w[i]+=y;
}
void qujian_add(int x,int y,int k){
	add(x,k);add(y+1,-k);
}
int ask(int a)
{
	int res=0;
	for(int i=a;i;i-=lowbit(i))
		res+=w[i];
	return res;
}
int main()
{
	int a,x,y,z;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>q[i];
		add(i,q[i]-q[i-1]);
	}
	for(int i=1;i<=m;i++)
	{
		cin>>a;
		if(a==1)
		{
			cin>>x>>y>>z;
			qujian_add(x,y,z);
		}
		else if(a==2)
		{
			cin>>x;
			cout<<ask(x)<<endl;
		}
	}
}

本蒟蒻文笔不好,请大佬多多包涵

posted @ 2020-03-19 17:52  iloveori  阅读(175)  评论(0编辑  收藏  举报