博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj1195(二维树状数组)
阅读量:6885 次
发布时间:2019-06-27

本文共 1293 字,大约阅读时间需要 4 分钟。

题目链接:https://vjudge.net/problem/POJ-1195

题意:有s*s的矩阵,初始化为全0,有两种操作,单点修改(x,y)的值,区间查询(x,y)的值(l<=x<=r,b<=y<=t)。

思路:二维树状数组裸应用查询区间(l,b)~(r,t)的值可转换为tr[r][t]-tr[l-1][t]-tr[r][b-1]+tr[l-1][b-1]。要注意的是输入的x,y是从0开始的,所以要加1。

AC代码:  

#include
#include
using namespace std;inline int read(){ int x=0,f=0;char c=0; while(!isdigit(c)){f|=c=='-';c=getchar();} while(isdigit(c)){x=(x<<3)+(x<<1)+(c^48);c=getchar();} return f?-x:x;}int op,s,tr[1030][1030];int lowbit(int x){ return x&(-x);}void update(int x,int y,int k){ while(x<=s){ int tmp=y; while(tmp<=s){ tr[x][tmp]+=k; tmp+=lowbit(tmp); } x+=lowbit(x); }}int query(int x,int y){ int ans=0; while(x>0){ int tmp=y; while(tmp>0){ ans+=tr[x][tmp]; tmp-=lowbit(tmp); } x-=lowbit(x); } return ans;}int main(){ op=read(),s=read(); while(op=read(),op!=3){ if(op==1){ int x=read()+1,y=read()+1,k=read(); update(x,y,k); } else{ int l=read()+1,b=read()+1,r=read()+1,t=read()+1; printf("%d\n",query(r,t)-query(l-1,t)-query(r,b-1)+query(l-1,b-1)); } } return 0;}

 

转载于:https://www.cnblogs.com/FrankChen831X/p/10799465.html

你可能感兴趣的文章
jq 操作表单中 checkbox 全选 单选
查看>>
高并发和大流量解决方案@year12
查看>>
模板:排序(三)
查看>>
jsp页面动态展示list-使用<select>和<c:forEach>标签
查看>>
html 样式之style属性的使用
查看>>
Linux 中显示所有正在运行的进程
查看>>
POJ 1753 Flip Game
查看>>
Vc控件用法总结之List Control
查看>>
[转] 【开源访谈】Muduo 作者陈硕访谈实录
查看>>
LeetCode 86. Partition List 20170612
查看>>
我的XHTML学习笔记
查看>>
单链表的增删查改
查看>>
centos7系统安装python3,pip3,django
查看>>
php观察者模式
查看>>
励志名言
查看>>
Linux基本命令 文件搜索命令
查看>>
C#点击按钮用DataGridView动态增加行、删除行,增加按钮列
查看>>
重构的信号
查看>>
如何计算团队贡献
查看>>
图片特效处理之怀旧效果
查看>>