树状数组

来源:互联网 发布:java的设计模式有哪些 编辑:程序博客网 时间:2024/06/09 15:59

1、POJ 3468 A Simple Problem with Integers

参考:《挑战程序设计竞赛》P182

区间同时加上一个数,区间求和

#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <queue>#include <vector>#include <stack>#include <map>#include <set>#include <cmath>#include <cctype>#include <ctime>#include <cassert>using namespace std;#define REP(i, n) for (int i = 0; i < (n); ++i)#define eps 1e-9#define lson low, mid, _id << 1#define rson mid + 1, high, _id << 1 | 1typedef long long ll;typedef pair<int, int> pii;const int INF = 0x7fffffff;const int maxn = 1e5 + 10;int N, Q, A, a, b, c;char cmd[2];ll c0[maxn], c1[maxn];inline ll lowbit(int x) { return x & (-x); }void update(ll *c, ll x, ll add);ll query(ll *c, ll x);int main() {#ifdef __AiR_H    freopen("in.txt", "r", stdin);//    freopen("out.txt", "w", stdout);#endif // __AiR_H    scanf("%d %d", &N, &Q);    for (int i = 1; i <= N; ++i) { scanf("%d", &A); update(c0, i, A); }    while (Q--) {        scanf("%s", cmd);        if (cmd[0] == 'C') {            scanf("%d %d %d", &a, &b, &c);            update(c0, a, -c * (a - 1)); update(c0, b + 1, c * b);            update(c1, a, c); update(c1, b + 1, -c);        } else {            scanf("%d %d", &a, &b);            ll ans = 0;            ans += query(c0, b) + query(c1, b) * b;            ans -= query(c0, a - 1) + query(c1, a - 1) * (a - 1);            printf("%lld\n", ans);        }    }#ifdef __AiR_H    printf("Time used = %.2fs\n", (double)clock() / CLOCKS_PER_SEC);#endif // __AiR_H    return 0;}void update(ll *c, ll x, ll add) {    while (x <= N) { c[x] += add; x += lowbit(x); }}ll query(ll *c, ll x) {    ll ret = 0;    while (x > 0) { ret += c[x]; x -= lowbit(x); }    return ret;}





0 0
原创粉丝点击