POJ 1195 Mobile phones 二维线段树
来源:互联网 发布:linux下android studio 编辑:程序博客网 时间:2024/06/06 14:18
题目:
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;}
阅读全文
0 0
- POJ 1195 Mobile phones 二维线段树
- POJ 1195 Mobile phones 二维线段树
- POJ - 1195 - Mobile phones (二维线段树)
- 线段树-- POJ - 1195 Mobile phones
- POJ 1195 Mobile phones 线段树 二维线段树 单点更新 区间求和
- POJ 1195 Mobile phones (二维树状数组或线段树)
- Mobile phones poj1195 二维线段树
- POJ1195 Mobile phones 【二维线段树】
- POJ 1195 Mobile phones (二维树状树组)
- POJ 1195 Mobile phones 二维树状数组
- POJ 1195 Mobile phones【二维树状数组】
- POJ 1195 Mobile phones 二维树状数组
- poj 1195 Mobile phones 二维树状数组
- POJ 1195 Mobile phones 二维树状数组
- poj 1195 Mobile phones +二维树状数组
- POJ 1195 Mobile phones 二维树状数组
- Mobile Phones poj 1195--二维树状数组
- POJ 1195 Mobile phones【二维树状数组】
- 我是如何通过命令执行到最终获取内网Root权限的
- NYOJ 116 士兵杀敌(二)(树状数组模板)
- UVA
- theano下CNN网络验证测试自己的数据集
- MFC下CFile读写结构体,读写文件。
- POJ 1195 Mobile phones 二维线段树
- java算法-栈/队列/堆栈
- uva 442 Matrix Chain Multiplication
- S-阶乘除法
- Java script事件详解
- 城市交通
- 欢迎使用CSDN-markdown编辑器
- docker 自定义安装 nginx
- Dirt Ratio HDU