树状数组
这是一个非常好用的工具,死记就可以啦
单点修改,查前缀和:
int bit[N]; void add(int x, int p) { for (;x <= N; x += x & -x) bit[x] += p; } int que(int x) { int sum = 0; for (;x; x -= x & -x) sum += bit[x]; return sum; }
区间修改,查前缀和
long long bit1[N], bit2[N]; void add(int x, long long p) { for (int i=x; i<N; i+=i&-i) bit1[i] += p, bit2[i] += 1LL*x*p; } long long que(int x) { long long sum = 0; for (int i=x; i; i-=i&-i) sum += 1LL*bit1[i]*(x+1) - bit2[i]; return sum; }