【bzoj3132】上帝造题的七分钟 二维树状数组区间修改区间查询
题目描述
“第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵。
第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的操作。
第三分钟,k说,要能查询,于是便有了求给定矩形区域内的全部数字和的操作。
第四分钟,彩虹喵说,要基于二叉树的数据结构,于是便有了数据范围。
第五分钟,和雪说,要有耐心,于是便有了时间限制。
第六分钟,吃钢琴男说,要省点事,于是便有了保证运算过程中及最终结果均不超过32位有符号整数类型的表示范围的限制。
第七分钟,这道题终于造完了,然而,造题的神牛们再也不想写这道题的程序了。”
——《上帝造裸题的七分钟》
所以这个神圣的任务就交给你了。
输入
输入数据的第一行为X n m,代表矩阵大小为n×m。
从输入数据的第二行开始到文件尾的每一行会出现以下两种操作:
L a b c d delta —— 代表将(a,b),(c,d)为顶点的矩形区域内的所有数字加上delta。
k a b c d —— 代表求(a,b),(c,d)为顶点的矩形区域内所有数字的和。
请注意,k为小写。
输出
针对每个k操作,在单独的一行输出答案。
样例输入
X 4 4
L 1 1 3 3 2
L 2 2 4 4 1
k 2 2 3 3
样例输出
12
题解
二维树状数组区间修改区间查询
头一次知道树状数组还能实现区间修改区间查询~
我们先考虑一维的情况:树状数组的本质是$O(\log n)$维护前缀和,前缀相减可以得到区间和。
而又有一种区间修改单点查询的方法:差分。
设$d[i]=a[i]-a[i-1]$,那么$a[i]=(a[i]-a[i-1])+(a[i-1]-a[i-2])+...+(a[1]-a[0])=\sum\limits_{i=1}^nd[i]$,于是可以按照相同的方法维护差分数组的前缀和,修改的时候直接将l加上,r+1减去即可。
那么对于区间查询呢?我们还是引入差分的思想,则$\sum\limits_{i=1}^na[i]=\sum\limits_{i=1}^n\sum\limits_{j=1}^id[j]=\sum\limits_{j=1}^n(n+1-j)d[j]=(n+1)\sum\limits_{j=1}^nd[j]-\sum\limits_{j=1}^nj·d[j]$。所以维护两个树状数组,一个维护d[j]的前缀和,一个维护j*d[j]的前缀和就可以了。
那么对于本题变成二维的呢?其实也是一样的。
还是使用差分的方法,$a[n][m]=\sum\limits_{i=1}^n\sum\limits_{j=1}^md[i][j]$,$\sum\limits_{i=1}^n\sum\limits_{j=1}^ma[i][j]=\sum\limits_{i=1}^n\sum\limits_{j=1}^m\sum\limits_{k=1}^i\sum\limits_{l=1}^jd[k][l]=\sum\limits_{k=1}^n\sum\limits_{l=1}^m(n+1-k)(m+1-l)d[k][l]$。
展开什么的,自己动手丰衣足食
然后开4个树状数组即可。修改和查询时使用容斥原理拆成4段来完成。
#include <cstdio>
#include <algorithm>
#define N 2055
using namespace std;
int n , m;
char str[5];
struct data
{
int f[N][N];
void update(int x , int y , int a)
{
int i , j;
for(i = x ; i <= n ; i += i & -i)
for(j = y ; j <= m ; j += j & -j)
f[i][j] += a;
}
int query(int x , int y)
{
int i , j , ans = 0;
for(i = x ; i ; i -= i & -i)
for(j = y ; j ; j -= j & -j)
ans += f[i][j];
return ans;
}
}A , B , C , D;
void modify(int x , int y , int z)
{
A.update(x , y , z) , B.update(x , y , x * z) , C.update(x , y , y * z) , D.update(x , y , x * y * z);
}
int solve(int x , int y)
{
return (x + 1) * (y + 1) * A.query(x , y) - (y + 1) * B.query(x , y) - (x + 1) * C.query(x , y) + D.query(x , y);
}
int main()
{
int x1 , y1 , x2 , y2 , z;
scanf("%*s%d%d" , &n , &m);
while(~scanf("%s%d%d%d%d" , str , &x1 , &y1 , &x2 , &y2))
{
if(str[0] == 'L')
{
scanf("%d" , &z) , x2 ++ , y2 ++ ;
modify(x1 , y1 , z) , modify(x2 , y1 , -z) , modify(x1 , y2 , -z) , modify(x2 , y2 , z);
}
else x1 -- , y1 -- , printf("%d\n" , solve(x1 , y1) - solve(x2 , y1) - solve(x1 , y2) + solve(x2 , y2));
}
return 0;
}
【bzoj3132】上帝造题的七分钟 二维树状数组区间修改区间查询的更多相关文章
- [bzoj3132]上帝造题的七分钟——二维树状数组
题目大意 你需要实现一种数据结构,支援以下操作. 给一个矩阵的子矩阵的所有元素同时加一个数. 计算子矩阵和. 题解 一看这个题,我就首先想到用线段树套线段树做. 使用二维线段树的错误解法 其实是第一次 ...
- 【BZOJ3132】【TYVJ1716】上帝造题的七分钟 二维树状数组
题目大意 维护一个\(n\times m\)的矩阵,有两种操作: \(1~x_1~y_1~x_2~y_2~v\):把\((a,b),(c,d)\)为顶点的矩形区域内的所有数字加上\(v\). \(2~ ...
- tyvj P1716 - 上帝造题的七分钟 二维树状数组区间查询及修改 二维线段树
P1716 - 上帝造题的七分钟 From Riatre Normal (OI)总时限:50s 内存限制:128MB 代码长度限制:64KB 背景 Background 裸体就意味着 ...
- P4514 上帝造题的七分钟——二维树状数组
P4514 上帝造题的七分钟 求的是矩阵里所有数的和: 维护四个树状数组: #include<cstdio> #include<cstring> #include<alg ...
- 【bzoj5173】[Jsoi2014]矩形并 扫描线+二维树状数组区间修改区间查询
题目描述 JYY有N个平面坐标系中的矩形.每一个矩形的底边都平行于X轴,侧边平行于Y轴.第i个矩形的左下角坐标为(Xi,Yi),底边长为Ai,侧边长为Bi.现在JYY打算从这N个矩形中,随机选出两个不 ...
- POJ2155 Matrix(二维树状数组||区间修改单点查询)
Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row an ...
- poj 2155 (二维树状数组 区间修改 求某点值)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 33682 Accepted: 12194 Descript ...
- [POJ3468]关于整数的简单题 (你想要的)树状数组区间修改区间查询
#include <cstdio> #include <algorithm> #include <cstring> #include <cctype> ...
- 【poj2155】Matrix(二维树状数组区间更新+单点查询)
Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the ...
随机推荐
- Java设计模式(6)——创建型模式之原型模式(Prototype)
一.概述 概念 // 引用自<Java与模式> UML图 第二种:登记式 二.实践 先导知识 对象的拷贝: 直接赋值:此时只是相当于a1,a2指向同一个对象,无论哪一个操作的都是同一个对象 ...
- 成都Uber优步司机奖励政策(3月26日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 无偏方差为什么除以n-1
设样本均值为,样本方差为,总体均值为,总体方差为,那么样本方差有如下公式:. 很多人可能都会有疑问,为什么要除以n-1,而不是n,但是翻阅资料,发现很多都是交代到,如果除以n,对样本方差的估计不是无偏 ...
- 『Python Kivy』API说明:kivy.app.App
App类是创建Kivy应用的基础.我们可以将其看成是Kivy运行循环当中的主入口.在绝大多数的例子中,你创建这个类的子类,然后构建你自己的应用.当你已经准备好开始应用的整个生命周期时,你可以实例化你定 ...
- pip源设置 & pandas安装
pip的官方源python.pypi.org貌似被墙,换用国内安装源 网上的设置方法都是基于Unix的,Windows下的设置略麻烦. 更新..\Lib\site-packages\pip下的cmdo ...
- 180531-Spring中JavaConfig知识小结
原文链接:Spring中JavaConfig知识小结/ Sring中JavaConfig使用姿势 去掉xml的配置方式,改成用Java来配置,最常见的就是将xml中的 bean定义, scanner包 ...
- AirtestIDE实践一:梦幻西游手游师门任务自动化
Airtest Project是网易自研的游戏自动化项目.Airtest IDE是这个项目的一个IDE,就像Eclipse.Pycharm一样,是一个集成开发工具.Airtest框架是一个基于Open ...
- Java开发工程师(Web方向) - 01.Java Web开发入门 - 第2章.HTTP协议简介
第2章--HTTP协议简介 HTTP协议简介 Abstract: HTTP协议的特性,HTTP请求/响应的过程,HTTP请求/响应的报文格式等知识,最后会演示如何通过Chrome提供的开发者工具,去跟 ...
- Idea Live Templates
常用live templates 模板 注释 : * * @param $params$ * @return $return$ * $date$ $time$ chiyuanzhen743 */ lo ...
- LeetCode 240——搜索二维矩阵 II
1. 题目 2. 解答 2.1. 方法一 从矩阵的左下角开始比较 目标值等于当前元素,返回 true: 目标值大于当前元素,j 增 1,向右查找,排除掉此列上边的数据(都比当前元素更小): 目标值小于 ...