树状数组
概念:利用二进制,每一个节点对某些节点进行包含
应用:
- 单点修改+区间查询,大多数时候都是一次只改一个树,查询区间内出现的次数
- 排序+树状数组可以模拟左边有没有比他大的数。
#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; }
后记:
- 查询的时候一定要左边点 --
- a&(-a); // 建议自己去模拟几遍就行拉