poj1195(二维树状数组)
2024-10-16 14:14:56
题目链接: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<cstdio>
#include<cctype>
using namespace std; inline int read(){
int x=,f=;char c=;
while(!isdigit(c)){f|=c=='-';c=getchar();}
while(isdigit(c)){x=(x<<)+(x<<)+(c^);c=getchar();}
return f?-x:x;
} int op,s,tr[][]; 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=;
while(x>){
int tmp=y;
while(tmp>){
ans+=tr[x][tmp];
tmp-=lowbit(tmp);
}
x-=lowbit(x);
}
return ans;
} int main(){
op=read(),s=read();
while(op=read(),op!=){
if(op==){
int x=read()+,y=read()+,k=read();
update(x,y,k);
}
else{
int l=read()+,b=read()+,r=read()+,t=read()+;
printf("%d\n",query(r,t)-query(l-,t)-query(r,b-)+query(l-,b-));
}
}
return ;
}
最新文章
- 消除左递归c语言文法
- Oracle 数据库重放(Database Replay)功能演示
- mysql安装中出现的问题,
- Linux(CentOS)系统下设置nginx开机自启动
- javascript this 详解
- TortoiseGit中push的使用
- Swift - String与NSString的区别,以及各自的使用场景
- Good Vegetable 4级算法题 分值: [320/3120] 问题: [8/78]
- HDU 1698 Just a Hook 线段树+lazy-target 区间刷新
- PAT甲级
- 力扣(LeetCode)461. 汉明距离
- codeforces959C
- day3----编码-集合-深浅copy-文件操作-函数初识
- advertisingIdentifier
- 【星云测试】Devops微服务架构下具有代码级穿透能力的精准测试
- Windows无法访问局域网内共享文件夹[0x800704cf,0x80070035]解决方案
- JZOJ.5331【NOIP2017模拟8.23】壕游戏
- Spring框架 之IOC容器 和AOP详解
- 针对jquery的ajax中的参数理解
- web测试中的测试点和测试方法总结