POJ
来源:互联网 发布:淘宝的目标消费群 编辑:程序博客网 时间:2024/06/05 15:34
题目大意:
给你一个s*s的方阵,然后有若干操作:给指定点增加数量(可能为负);查询指定区域数量总和。用二维树状数组即可。
关于二维树状数组:
还是用类比一维树状数组的想法,让在一个区域上一些位置上的数,来表示原数组一些特定区域上的点的值的和。具体的原理我会在下一篇树状数组总结中给出。魔板代码可以看一下这一篇的sum和add函数。
代码:
#include<iostream>#include<string.h>#include<stdio.h>using namespace std;int s;long long int tree[1100][1100];int lowbit(int x){ return x&(-x);}void add(int x,int y,int a){ for(int i=x;i<=s;i+=lowbit(i)) { for(int j=y;j<=s;j+=lowbit(j)) { tree[i][j]+=a; } }}long long int sum(int x,int y){ long long int s=0; for(int i=x;i>0;i-=lowbit(i)) { for(int j=y;j>0;j-=lowbit(j)) { s+=tree[i][j]; } } return s;}int main(){ int l; while(scanf("%d",&l)) { if(l==3)return 0; if(l==0) { memset(tree,0,sizeof(tree)); scanf("%d",&s); } if(l==1) { int x,y,a; scanf("%d%d%d",&x,&y,&a); x++;y++; add(x,y,a); } if(l==2) { int l,b,r,t; scanf("%d%d%d%d",&l,&b,&r,&t); l++;b++;r++;t++; long long int ans=sum(r,t)-sum(r,b-1)-sum(l-1,t)+sum(l-1,b-1); if(ans<0)ans=0; printf("%d\n",ans); } }}
0 0
- POJ
- poj
- POJ
- POJ
- poj
- poj
- POJ
- POJ
- poj
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- 第二次爬虫实战--知乎
- java程序在开发工具上运行正常,打包之后本地运行报错Attempt to refer to a unregistered pool by its alias '**'
- 一文读懂机器学习,大数据/自然语言处理/算法全有了……
- 用vs2013编译用vs2015写的memcached遇到的平台问题
- android7.0 点击reset app preferences,后台services关闭
- POJ
- ISO-OSI的七层协议经典架构
- java中IO流的知识点总结
- Sql Server之旅——第二站 理解万恶的表扫描
- jdk动态代理和cglib动态代理剖析
- MATLAB中unwrap函数
- socket字节序转换中,人能看懂和看不懂的
- JavaBean和jsp学习笔记
- Wicket搭建项目 Maven配置