树状数组

  这是一个非常好用的工具,死记就可以啦

  单点修改,查前缀和:

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;
}

 

posted @ 2018-08-13 15:51  惜梦园  阅读(62)  评论(0)    收藏  举报