树状数组

概念:利用二进制,每一个节点对某些节点进行包含

应用:

  • 单点修改+区间查询,大多数时候都是一次只改一个树,查询区间内出现的次数
  • 排序+树状数组可以模拟左边有没有比他大的数。

 

#include <bits/stdc++.h>
using namespace std;
#define ri register int
#define M 100005

template <class G > void read(G &x)
{
    x=0;int f=0;char ch=getchar();
    while(ch<'0'||ch>'9'){f|=ch=='-';ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    x=f?-x:x;
    return ;
} 


int n,m;
int val[M];
void xiu(int a,int b)
{
    while(a<=n)
    {
        val[a]+=b;
        a+=a&(-a);
    }
}
int qu(int a)
{
    int ans=0;
    while(a>=1)
    {
        ans+=val[a];
        a-=a&(-a);
    }
    return ans;
}
int main(){
    
    
    read(n);read(m);
    for(ri i=1;i<=n;i++)
    {
        int op;
        read(op);
        if(op==1)
        {
            int a,b;read(a),read(b);
            xiu(a,b);
        }
        else
        {
            int a,b;
            read(a),read(b);
            int ans=qu(b)-qu(a-1);
            printf("%d\n",ans);
        }
    }
    
    return 0;    
}
View Code

 

 后记:

  • 查询的时候一定要左边点 -- 
  • a&(-a); // 建议自己去模拟几遍就行拉

 

posted @ 2019-11-05 14:45  VxiaohuanV  阅读(102)  评论(0编辑  收藏  举报