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; }
相关文章推荐
- POJ-1195 Mobile phones 二维线段树 区间求和
- poj1195 Mobile phones 二维线段树和二维树状数组两种做法 树套树
- POJ 1195 Mobile phones (二维树状数组或线段树)
- POJ 1195 Mobile phones (二维树状数组或线段树)
- POJ 1195 Mobile phones 二维线段树
- POJ 1195 Mobile phones 线段树 二维线段树 单点更新 区间求和
- POJ1195 Mobile phones —— 二维树状数组(二维BIT)
- poj 1195 mobile phones 二维树状数组
- poj1195 mobile phones 【二维树状数组】
- poj 1195 Mobile phones 二维树状数组
- POJ 1195 Mobile phones (二维树状数组)
- POJ 1195 Mobile phones (二维树状数组)
- POJ-1195 Mobile phones 二维树状数组
- POJ 1195 Mobile phones (二维树状数组)
- POJ1195 Mobile phones 二维数状数组
- POJ 1195 Mobile phones 二维树状数组
- POJ 1195 Mobile phones 二维树状数组
- poj 1195 Mobile phones (二维树状数组)
- 【poj 1195】Mobile phones 二维树状数组
- POJ 1195 Mobile phones 二维树状数组