poj 1195 Mobile phones
2015-11-21 14:48
399 查看
一个简单的二维树状数组水题(真的好裸
命令1 x y v,就是对x,y这个点加上一个v
命令2 x1 y1 x2 y1就是询问这个区间内的所有点的权值和,这个可以简单容斥一下,就是query(x2,y2)-query(x1-1,y2)-query(x2,y1-1)+query(x1-1,y1-1),也很简单
那么就这样
代码(
命令1 x y v,就是对x,y这个点加上一个v
命令2 x1 y1 x2 y1就是询问这个区间内的所有点的权值和,这个可以简单容斥一下,就是query(x2,y2)-query(x1-1,y2)-query(x2,y1-1)+query(x1-1,y1-1),也很简单
那么就这样
代码(
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 1123; int sum[maxn][maxn]; inline int lowbit(int x){ return x&(-x); } void add(int x,int y,int v,int n){ for(int i=x;i<=n;i+=lowbit(i)) for(int j=y;j<=n;j+=lowbit(j)) sum[i][j]+=v; } int query(int x,int y){ int ret = 0; for(int i=x;i>0;i-=lowbit(i)) for(int j=y;j>0;j-=lowbit(j)) ret+=sum[i][j]; return ret; } int main(){ int ord,n; while(~scanf("%d %d",&ord,&n)){ memset(sum,0,sizeof(sum)); int x1,x2,y1,y2; int val; scanf("%d",&ord); while(ord!=3){ if(ord==1){ scanf("%d %d %d",&x1,&y1,&val); x1++,y1++; add(x1,y1,val,n); } else{ scanf("%d %d %d %d",&x1,&y1,&x2,&y2); x1++,x2++,y1++,y2++; val = query(x2,y2)-query(x1-1,y2)-query(x2,y1-1)+query(x1-1,y1-1); printf("%d\n",val); } scanf("%d",&ord); } } return 0; }
相关文章推荐
- jQuery 获取屏幕高度、宽度
- php 严格控制session的过期时间
- 使用 jQuery Mobile 与 HTML5 开发 Web App (一) ——开发原则
- 录音的基本使用
- android64位机子兼容32位.so库文件
- iOS runtime运行时机制
- RedHat&CentOS 安装谷歌浏览器chrome 与创建桌面快捷方式
- django 报错问题集锦
- webStorm中的混乱代码格式化
- CSSREM插件
- C++控制台循环链表实现贪吃蛇
- linux下磁盘阵列配置方法
- Spoj 1716 Can you answer these queries III
- Linux进程间通信(IPC)编程实践(六)共享内存的使用-mmap
- Java对称加密算法DES[以及其他对称加密算法]
- linux驱动之input子系统之按键驱动编写流程(三)
- GestureDetector类及其用法
- SSH开发使用BaseAction<T>做为所有Action抽象父类。这段代码啥意思?
- 如何请其他小组同事排查问题
- 雁过留痕 - 整理不错的网络资源(持续更新)