【树状数组(BIT)】

来源:互联网 发布:淘宝网查机票 编辑:程序博客网 时间:2024/06/06 12:38

【树状数组模版】

注意:树状数组x必须>0,因为lowbit(0) = 0,会死循环;

【单点更新区间查询】在log(n)内修改单点,求出cnt[x] = a[1]~a[x]之和

求区间[a,b]之和只要求出 sum(b)-sum(a-1)即可

#define rep(i,a,n) for(int i = a; i < n; i++)#define repe(i,a,n) for(int i = a; i <= n; i++)#define per(i,n,a) for(int i = n; i >= a; i--)#define clc(a,b) memset(a,b,sizeof(a))#define INF 0x3f3f3f3ftypedef long long LL;#define MAXN 100010int cnt[MAXN],mx, a[MAXN];inline int lowbit(int x){return x&-x;}int sum(int x){int ans = 0;while(x > 0){ans += cnt[x];x -= lowbit(x);}return ans;}void update(int x, int num){while(x <= mx){cnt[x] += num;x += lowbit(x);}}

【区间更新单点查询】在log(n)内修改区间a[1]~a[x]覆盖次数,求出单点被覆盖的次数

要修改区间[a,b]的覆盖次数+1,可以 update(b,1), update(a-1,-1);

#define rep(i,a,n) for(int i = a; i < n; i++)#define repe(i,a,n) for(int i = a; i <= n; i++)#define per(i,n,a) for(int i = n; i >= a; i--)#define clc(a,b) memset(a,b,sizeof(a))#define INF 0x3f3f3f3ftypedef long long LL;#define MAXN 100010int cnt[MAXN],mx, a[MAXN];inline int lowbit(int x){return x&-x;}int sum(int x){int ans = 0;while(x <= mx){ans += cnt[x];x += lowbit(x);// += 是点 -=是区间,所用到的点独立,区间不相交}return ans;}void update(int x, int num){while(x > 0){cnt[x] += num;x -= lowbit(x);}}



 

0 0
原创粉丝点击