树状数组
来源:互联网 发布: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