Mobile phones POJ - 1195

原题链接

  • 题解:二维树状数组,第一次遇见,就是快速的计算出前缀和。
  • 代码:
#include <cstdio>
#include <iostream>
#include <queue>
#include <cstring>
#include <vector>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;
typedef long long ll;
const ll inf = 0x3f3f3f3f;
const ll N = 1333;
int n;
struct BIT {
    ll d[N][N];
    inline ll lowbit(ll x) {return -x&x;}
    void add (int x, int y, ll k) {
        for (int i = x; i <= n; i += lowbit(i)) {
            for (int j = y; j  <= n; j += lowbit(j)) {
                d[i][j] +=k;
            }
        }
    }
    ll ask(int x, int y) {
        ll ret = 0;
        for (int I = x; I >0; I -= lowbit(I)) {
            for (int J = y; J > 0; J -= lowbit(J)) {
                ret += d[I][J];
            }
        }
        return ret;
    }
}T;
signed main() {
    scanf("%d%d", &n, &n);
    n++;
    int op;
    while (~scanf("%d", &op)) {
        if (op == 3)break;
        else if (op == 2) {
            int x1, y1, x2, y2;

            scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
            x1 ++,y1++,x2++,y2++;
            printf("%lld\n", T.ask(x2, y2) - T.ask(x1-1, y2) - T.ask(x2, y1-1) + T.ask(x1-1, y1-1));
        }
        else if (op == 1) {
            int x, y, k;
            scanf("%d%d%d", &x, &y, &k);
            x++,y++;
            T.add(x, y, k);
           // cout << T.ask(x, y) << endl;
        }
    }
}

posted @ 2021-04-23 13:41  u_yan  阅读(39)  评论(0编辑  收藏  举报