树状数组及其离散化模板

0)、离散化

// arr[i] 为初始数组,下标范围为 [1, n]

for (int i = 1; i <= n; ++i)  // step 1
  tmp[i] = arr[i];
sort(tmp + 1, tmp + n + 1);                          // step 2
int len = unique(tmp + 1, tmp + n + 1) - (tmp + 1);  // step 3
for (int i = 1; i <= n; ++i)                              // step 4
  arr[i] = lower_bound(tmp + 1, tmp + len + 1, arr[i]) - tmp;

vector<int> tmp(arr);  // tmp 是 arr 的一个副本
sort(tmp.begin(), tmp.end());
tmp.erase(unique(tmp.begin(), tmp.end()), tmp.end());
for (int i = 0; i < n; ++i)
  arr[i] = lower_bound(tmp.begin(), tmp.end(), arr[i]) - tmp.begin();

1)、单点增减+区间求和
思路:C[x]表示该点的元素:sum(x)=C[1]+C[2]+……C[x]

int arr[MAXN];
int lowbit(int x) { return x & (-x); }

inline int sum(int x){int res=0; while(x) res+=arr[x],x-=lowbit(x);return res;}

inline void add(int x,int n){while(x<MAXN) arr[x]+=n,x+=lowbit(x);}

inline int query(int x,int y){return sum(y)-sum(x-1);}

(2)、区间增减+单点查询
思路:C[x]表示该点元素与左边元素的差值:num[x]=C[1]+C[2]+……C[x]

int arr[MAXN];

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

inline int sum(int x){int res=0; while(x) res+=arr[x],x-=lowbit(x);return res;}

inline void add(int x,int n){while(x<MAXN) arr[x]+=n,x+=lowbit(x);}

inline int update(int x,int y,int n){add(x,n); add(y+1,-n);}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值