您的位置:首页 > 其它

poj 1195 Mobile phones 【二维树状数组】

2016-03-23 00:06 459 查看
题目链接:poj 1195 Mobile phones

题意:n∗n矩阵。操作

1、0n 清空矩阵元素为0,建立n∗n矩阵;

2、1xyd 矩阵元素(x,y)加d;

3、2x1y1x2y2求解以(x1,y1)为左上角(x2,y2)为右下角的矩阵元素和。

单点修改、求和时间复杂度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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: