http://acm.hdu.edu.cn/showproblem.php?pid=4970
好像还没有用树状数组写过区间更新,但是树状数组的确比线段树快很多,不知道跟ZKW线段树比效率怎么样:
先贴个模板:
#include
const int MAXN = 1024;
int B[MAXN], C[MAXN];
#define LOWBIT(x) ((x)&(-(x)))
void bit_update(int *a, int p, int d) {
for ( ; p && p < MAXN ; p += LOWBIT(p))
a[p] += d;
}
int bit_query(int *a, int p) {
int s = 0;
for ( ; p ; p -= LOWBIT(p))
s += a[p];
return s;
}
void bit_update2(int *a, int p, int d) {
for ( ; p ; p -= LOWBIT(p))
a[p] += d;
}
int bit_query2(int *a, int p) {
int s = 0;
for ( ; p && p < MAXN ; p += LOWBIT(p))
s += a[p];
return s;
}
inline void _insert(int p, int d) {
bit_update(B, p, p*d);
bit_update2(C, p-1, d);
}
inline int _query(int p) {
return bit_query(B, p) + bit_query2(C, p) * p;
}
inline void insert_seg(int a, int b, int d) {
_insert(a-1, -d);
_insert(b, d);
}
inline int query_seg(int a, int b) {
return _query(b) - _query(a-1);
}
int main() {
int com, a, b, c;
while (scanf("%d%d%d",&com,&a,&b) != EOF) {
a += 2; b += 2; //防止出现负数
if (com == 0) { //更新
scanf("%d",&c);
insert_seg(a, b, c);
} else { //查询
printf("%d/n",query_seg(a,b));
}
}
return 0;
}
#include
#include
#include
#include
#include
#include
#include
#include
其实也是树状数组的思想,但是我树状数组还是不怎么熟练啊 300ms AC
#include
#include
#include
#include
#include