poj 1195 Mobile phones
2016-05-23 21:14
375 查看
这道题的题意是先给一个数字i,假如i==0,就对将数组array初始化为0,i==1,随后给出x,y,data,然后使array[x][y] += data,i==3,随后给出x1,y1,x2,y2,
则输出sum(array[x1][y1]...array[x2][y2])
这一道题需要用到二维树状数组来做.
唯一要注意的是当输入数据中有0的存在时,数组可能访问到-1位置,所以对所有的坐标都+1
则输出sum(array[x1][y1]...array[x2][y2])
这一道题需要用到二维树状数组来做.
唯一要注意的是当输入数据中有0的存在时,数组可能访问到-1位置,所以对所有的坐标都+1
#include <cstdio> #include <cstring> using namespace std; #define max_n 1200 int bit[max_n][max_n]; int n; int lowbit(int x) { return x&(-x); } void add(int x,int y,int data) { int a,b; for(a=x;a<=n;a+=lowbit(a)) for(b=y;b<=n;b+=lowbit(b)) { bit[a][b] += data; } } int sum(int x,int y) { int a,b; int num = 0; for(a=x;a>0;a-=lowbit(a)) for(b=y;b>0;b-=lowbit(b)) { num+=bit[a][b]; } return num; } int getsum(int x1,int y1,int x2,int y2) { return sum(x2,y2) - sum(x2,y1-1) - sum(x1-1,y2) + sum(x1-1,y1-1); } int main() { int op; int x1,y1,x2,y2,data; while(~scanf("%d",&op)) { if(op==0) { scanf("%d",&n); memset(bit,0,sizeof(bit)); } if(op==1) { scanf("%d%d%d",&x1,&y1,&data); add(++x1,++y1,data); } if(op==2) { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); printf("%d\n",getsum(++x1,++y1,++x2,++y2)); } if(op==3) break; } }
相关文章推荐
- Android中ListView分页加载数据
- static的作用
- UIImage的 stretchableImageWithLeftCapWidth 方法的使用
- android studio 快捷键(持续更新)
- 构造器和this()
- Uva 11468 Substring (AC自动机)
- 工作日志——行为流程
- sdut 2617 矩阵(sdut第五届校赛)
- 数组的一些知识点和插入选择冒泡排序
- ASIHttpRequest使用详解
- Tikhonov regularization和岭回归
- windbg学习进阶之——dump分析常用命令收集
- Python + win10 +Apache CGI 错误500的解决方法
- 项目第二周总结
- 印度混战,谁是最佳手机?
- Leetcode - Nim Game
- 数组求和
- QT QLineEdit 获取焦点/获取焦点后全选字符
- 人月神话阅读笔记01
- 虚拟内存