您的位置:首页 > 其它

POJ 1195 Mobile phones 二维线段树

2017-08-08 20:26 369 查看

题目:

http://poj.org/problem?id=1195

题意:

给出一个s*s的矩阵,有以下四种操作:

0 S 把一个S*S的矩阵全初始化为0,这个操作仅在最初执行一次

1 X Y A 把(X, Y)处的元素加上A

2 L B R T 查询以(L, R)为左上角、(B, T)为右下角的矩阵内元素的和

3 结束操作

思路:

二维线段树,很裸的题目了。。。不裸的话,有二维线段树写起来很麻烦,而且空间很容易被卡,感觉有点鸡肋啊。。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1000 + 26, INF = 0x3f3f3f3f;

int n;
int sum[N<<2][N<<2];
void push_upy(int ky, int kx)
{
sum[kx][ky] = sum[kx][ky<<1] + sum[kx][ky<<1|1];
}
void push_upx(int ky, int kx)
{
sum[kx][ky] = sum[kx<<1][ky] + sum[kx<<1|1][ky];
}
void updatey(int y, int L, int R, int ky, int kx, int val, int f)
{
if(L == R)
{
if(f) sum[kx][ky] += val;
else push_upx(ky, kx);
return;
}
int mid = (L + R) >> 1;
if(y <= mid) updatey(y, L, mid, ky << 1, kx, val, f);
else updatey(y, mid + 1, R, ky << 1|1, kx, val, f);
push_upy(ky, kx);
}
void updatex(int x, int y, int L, int R, int kx, int val)
{
if(L == R)
{
updatey(y, 1, n, 1, kx, val, 1); return;
}
int mid = (L + R) >> 1;
if(x <= mid) updatex(x, y, L, mid, kx << 1, val);
else updatex(x, y, mid + 1, R, kx << 1|1, val);
updatey(y, 1, n, 1, kx, val, 0);
}
int queryy(int ly, int ry, int L, int R, int ky, int kx)
{
if(ly <= L && R <= ry) return sum[kx][ky];
int mid = (L + R) >> 1, ans = 0;
if(ly <= mid) ans += queryy(ly, ry, L, mid, ky << 1, kx);
if(ry > mid) ans += queryy(ly, ry, mid + 1, R, ky << 1|1, kx);
return ans;
}
int queryx(int lx, int rx, int ly, int ry, int L, int R, int kx)
{
if(lx <= L && R <= rx) return queryy(ly, ry, 1, n, 1, kx);
int mid = (L + R) >> 1, ans = 0;
if(lx <= mid) ans += queryx(lx, rx, ly, ry, L, mid, kx << 1);
if(rx > mid) ans += queryx(lx, rx, ly, ry, mid + 1, R, kx << 1|1);
return ans;
}
int main()
{
int op;
//memset(sum, 0, sizeof sum);
while(scanf("%d", &op), op != 3)
{
if(op == 0) scanf("%d", &n);
else if(op == 1)
{
int x, y, val;
scanf("%d%d%d", &x, &y, &val);
x++, y++;
updatex(x, y, 1, n, 1, val);
}
else if(op == 2)
{
int l, b, r, t;
scanf("%d%d%d%d", &l, &b, &r, &t);
l++, b++, r++, t++;
printf("%d\n", queryx(l, r, b, t, 1, n, 1));
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: