poj 1195 Mobile phones (二维树状数组)
2015-09-03 16:43
387 查看
题目大意:
有一个S*S的数组。
有两种操作:
一、h[X,Y]加上A
二、查询所有x1<=i<=x2, y1<=j<=y2的h[i, j]的和。
这一题是一道二维树状数组的模板体。
如果要查询(x1,y1,x2,y2)的值:只要查询query(1, 1, x2, y2) + query(1, 1, x1-1, y1-1) - query(1, 1, x2, y1-1) - query(1, 1, x1-1, y2)
这个查询和维护可以使用二维树状数组来维护
我的代码:
有一个S*S的数组。
有两种操作:
一、h[X,Y]加上A
二、查询所有x1<=i<=x2, y1<=j<=y2的h[i, j]的和。
这一题是一道二维树状数组的模板体。
如果要查询(x1,y1,x2,y2)的值:只要查询query(1, 1, x2, y2) + query(1, 1, x1-1, y1-1) - query(1, 1, x2, y1-1) - query(1, 1, x1-1, y2)
这个查询和维护可以使用二维树状数组来维护
我的代码:
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string> #include <cstring> using namespace std; const int MAXN = 1050; int h[1050][1050]; int n; int lowbit(int x) { return x & (-x); } void updata(int x, int y, int val) { int i, j; for (i=x; i<=n; i+=lowbit(i)) for (j=y; j<=n; j+=lowbit(j)) h[i][j] += val; } int query(int x, int y) { int i, j, ans = 0; for (i=x; i>0; i-=lowbit(i)) for (j=y; j>0; j-=lowbit(j)) ans += h[i][j]; return ans; } int main() { int tt, x, y, a, x1, y1, x2, y2, ans; scanf("%d%d",&tt,&n); memset(h, 0, sizeof(h)); while (scanf("%d",&tt)) { if (tt == 1) { scanf("%d%d%d",&x,&y,&a); x++; y++; updata(x, y, a); } else if (tt == 2) { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); x2++; y2++; x1++; y1++; ans = query(x2,y2) + query(x1-1, y1-1) - query(x2, y1-1) - query(x1-1, y2); printf("%d\n", ans); } else break; } return 0; }
相关文章推荐
- JDK5至JDK8的新特性
- 哈希
- 电话本管理系统(使用数组)
- 滑动窗口_单调队列入门 (白书P241)
- 二分查找
- Matlab界面设计入门
- for 语句头中多个定义
- 替换空格
- 数据结构 1____概论
- PAT(B) 1021. 个位数统计(简单哈希)
- 使用极光推送自定义消息打造个性的消息推送效果
- C 结构体位域
- jQuery基础学习3——jQuery库冲突
- 关于C++中的友元函数的总结
- 基本数据类型与byte之间的相互转换
- HDU 2047 阿牛的EOF牛肉串 递推
- 【OpenCV第一篇】安装OpenCV
- Hello JSP!——JSP动作元素分类
- Open Data Plane (ODP) 源码下载(git 服务器搭建)
- iOS的block内存管理