P4514 上帝造题的七分钟——二维树状数组
求的是矩阵里所有数的和;
维护四个树状数组;
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
int b[maxn][maxn],bi[maxn][maxn],bj[maxn][maxn],bij[maxn][maxn];
char s[];
int n,m,num; void add(int x,int y,int z) {for(int i=x;i<=n;i+=i&(-i)) for(int j=y;j<=m;j+=j&(-j)) b[i][j]+=z;}
void addi(int x,int y,int z) {for(int i=x;i<=n;i+=i&(-i)) for(int j=y;j<=m;j+=j&(-j)) bi[i][j]+=z;}
void addj(int x,int y,int z) {for(int i=x;i<=n;i+=i&(-i)) for(int j=y;j<=m;j+=j&(-j)) bj[i][j]+=z;}
void addij(int x,int y,int z) {for(int i=x;i<=n;i+=i&(-i)) for(int j=y;j<=m;j+=j&(-j)) bij[i][j]+=z;} int query_(int x,int y) { int ans=; for(int i=x;i;i-=i&(-i)) for(int j=y;j;j-=j&(-j)) ans+=b[i][j]; return ans;}
int query_i(int x,int y) { int ans=; for(int i=x;i;i-=i&(-i)) for(int j=y;j;j-=j&(-j)) ans+=bi[i][j]; return ans;}
int query_j(int x,int y) { int ans=; for(int i=x;i;i-=i&(-i)) for(int j=y;j;j-=j&(-j)) ans+=bj[i][j]; return ans;}
int query_ij(int x,int y) { int ans=; for(int i=x;i;i-=i&(-i)) for(int j=y;j;j-=j&(-j)) ans+=bij[i][j]; return ans;} void add_all(int x,int y,int num)
{
add(x,y,num);
addi(x,y,num*x);
addj(x,y,num*y);
addij(x,y,num*x*y);
} int query(int x,int y)
{
int ans=;
ans+=query_(x,y)*(x*y+x+y+)-query_i(x,y)*(y+)-query_j(x,y)*(x+)+query_ij(x,y);
return ans;
} int main()
{
scanf("%s%d%d",s,&n,&m);
while(~scanf("%s",s))
{
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(s[]=='L')
{
scanf("%d",&num);
add_all(x1,y1,num);
add_all(x1,y2+,-num);
add_all(x2+,y1,-num);
add_all(x2+,y2+,num);
}
else
{
printf("%d\n",query(x2,y2)-query(x2,y1-)-query(x1-,y2)+query(x1-,y1-));
} } return ;
}
我写的比较丑了,也可以将加入和查询操作放在结构体里面;
struct node
{
int tree[][]; int lowbit(int x) {return x&-x;} void add(int x,int y,int num)
{
for(int i=x; i<=n; i+=lowbit(i))
for(int j=y; j<=m; j+=lowbit(j))
tree[i][j]+=num;
} int query(int x,int y)
{
int res=;
for(int i=x; i>=; i-=lowbit(i))
for(int j=y; j>=; j-=lowbit(j))
res+=tree[i][j];
return res;
}
}b,bi,bj,bij;
差分和前缀和的思想;

P4514 上帝造题的七分钟——二维树状数组的更多相关文章
- tyvj P1716 - 上帝造题的七分钟 二维树状数组区间查询及修改 二维线段树
P1716 - 上帝造题的七分钟 From Riatre Normal (OI)总时限:50s 内存限制:128MB 代码长度限制:64KB 背景 Background 裸体就意味着 ...
- 【bzoj3132】上帝造题的七分钟 二维树状数组区间修改区间查询
题目描述 “第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的操作. ...
- 【BZOJ3132】【TYVJ1716】上帝造题的七分钟 二维树状数组
题目大意 维护一个\(n\times m\)的矩阵,有两种操作: \(1~x_1~y_1~x_2~y_2~v\):把\((a,b),(c,d)\)为顶点的矩形区域内的所有数字加上\(v\). \(2~ ...
- [bzoj3132]上帝造题的七分钟——二维树状数组
题目大意 你需要实现一种数据结构,支援以下操作. 给一个矩阵的子矩阵的所有元素同时加一个数. 计算子矩阵和. 题解 一看这个题,我就首先想到用线段树套线段树做. 使用二维线段树的错误解法 其实是第一次 ...
- BZOJ 3132: 上帝造题的七分钟( 二维BIT )
二维树状数组... 自己YY一下再推一下应该可以搞出来... --------------------------------------------------------------------- ...
- POJ 2029 Get Many Persimmon Trees (模板题)【二维树状数组】
<题目链接> 题目大意: 给你一个H*W的矩阵,再告诉你有n个坐标有点,问你一个w*h的小矩阵最多能够包括多少个点. 解题分析:二维树状数组模板题. #include <cstdio ...
- P4514 上帝造题的七分钟(二维树状数组)
P4514 上帝造题的七分钟 二维树状数组 差分维护区间加法,区间求和 #include<cstdio> int read(){ ,f=; ') f=f&&(c!='-') ...
- POJ 2155 Matrix (二维树状数组)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17224 Accepted: 6460 Descripti ...
- POJ_2155 Matrix 【二维树状数组】
一.题面 POJ2155 二.分析 楼教主出的题,是二维树状数组非常好的题,还结合了开关问题(开关变化的次数如果为偶数,状态不变,奇数状态相反). 题意就是给了一个二维的坐标平面,每个点初始值都是0, ...
随机推荐
- 【转】使用ASP.NET Web API构建Restful API
https://blog.csdn.net/mzl87/article/details/84947623 要点:使用DTO将内部实体与传输实体分离,利用Automapper实现两者的自动映射
- Tomcat一闪而过的调试方法
很少用tomcat来部署,都是用springboot微服务.只是以前学的时候搞demo试过而已. 软件测试的期末作业要求要测一个Javaweb的项目,给了一个包然后要求部署在tomcat中并启动. 然 ...
- hdu 1242 不用标记数组的深搜
#include<stdio.h>#include<string.h>char mapp[220][220];int m,n,mmin;void dfs(int x,int y ...
- 数据库中间件之mycat读写分离
mycat核心概念 逻辑库 mycat中定义.管理的数据库 逻辑表 逻辑库中包含的需分库分表存储的表 datanode 数据节点(分片节点),逻辑表分片的存放节点 datahost 数据主机(节点主机 ...
- ES与关系型数据库的通俗比较
1.在Elasticsearch中,文档归属于一种类型(type),而这些类型存在于索引(index)中,我们可以画一些简单的对比图来类比传统关系型数据库: Relational DB -> D ...
- 扩展 MongoDB.Driver 支持实体
针对MongoDB的官方C#驱动进行扩展 一.安装 Install-Package Apteryx.MongoDB.Driver.Extend 移步我的项目https://github.com/cod ...
- iftop:Linux流量监测工具
一.安装须知: (1)iftop 必须以root运行 (2)安装前首先安装:libpcap和libcurses 及包驱动ncurses-devel libpcap-devel (2.1)libpc ...
- ubuntu安装之后需要做什么
安装完ubuntu或者linux后应该做什么?首先在你安装完之后,都知道,很多系统都是有自带的一些软件之类,很多其实是不必要的,我们可以完全删掉,需要的时候再重装,那么安装完之后应该做什么呢? 1.智 ...
- mysql把A表数据插入到B表数据的几种方法
web开发中,我们经常需要将一个表的数据插入到另外一个表,有时还需要指定导入字段,设置只需要导入目标表中不存在的记录,虽然这些都可以在程序中拆分成简单sql来实现,但是用一个sql的话,会节省大量代码 ...
- 微信小程序 之wxml保留小数点后两位数的方法及转化为字符串的方法
原理:wxml中不能直接使用较高级的js语法,如‘.toFixed’,‘toString()’,但可以通过引入wxs模块实现效果 1.新建`filter.wxs` var filters = { ...