• 树状数组基本操作


    前言

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

    推荐一篇博客: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;
    		}
    	}
    }
    

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

  • 相关阅读:
    词法分析
    HTTP学习笔记
    Servlet入门
    UDP与TCP的区别
    C语言实现血型查询系统
    Mysql的索引、回表查询及覆盖索引浅析
    ReentranLock浅析
    CAS是个什么鬼?
    synchronize和volatile 小知识点总结
    写一个简单的阻塞队列
  • 原文地址:https://www.cnblogs.com/iloveori/p/12525908.html
Copyright © 2020-2023  润新知