题意:
n∗n
矩阵。操作
1、
0n
清空矩阵元素为0,建立
n∗n
矩阵;
2、
1xyd
矩阵元素
(x,y)
加
d
;
3、
单点修改、求和时间复杂度
O(logn∗logn)
。
AC
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <stack>
#define PI acos(-1.0)
#define CLR(a, b) memset(a, (b), sizeof(a))
#define fi first
#define se second
#define ll o<<1
#define rr o<<1|1
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
const int MAXN = 1100 + 10;
const int pN = 1e6;// <= 10^7
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
void add(LL &x, LL y) { x += y; x %= MOD; }
LL C[MAXN][MAXN];
int n;
int lowbit(int x) {
return x & (-x);
}
void add(int x, int y, int d) {
while(x <= n) {
int sy = y;
while(sy <= n) {
C[x][sy] += d;
sy += lowbit(sy);
}
x += lowbit(x);
}
}
LL Sum(int x, int y) {
LL ans = 0;
while(x > 0) {
int sy = y;
while(sy > 0) {
ans += C[x][sy];
sy -= lowbit(sy);
}
x -= lowbit(x);
}
return ans;
}
int main()
{
while(1)
{
int op; scanf("%d", &op);
int a, b, c, d;
if(op == 0) {
scanf("%d", &n);
CLR(C, 0);
}
else if(op == 1) {
scanf("%d%d%d", &a, &b, &c);
a++; b++;
add(a, b, c);
}
else if(op == 2) {
scanf("%d%d%d%d", &a, &b, &c, &d);
a++; b++; c++; d++;
printf("%lld\n", Sum(c, d) - Sum(a-1, d) - Sum(c, b-1) + Sum(a-1, b-1));
}
else {
return 0;
}
}
return 0;
}