二维树状数组+差分【p4514】上帝造题的七分钟
Description
“第一分钟,X说,要有矩阵,于是便有了一个里面写满了\(0\)的\(n\times m\)矩阵。
第二分钟,L说,要能修改,于是便有了将左上角为\((a,b)\),右下角为\((c,d)\)的一个矩形区域内的全部数字加上一个值的操作。
第三分钟,k说,要能查询,于是便有了求给定矩形区域内的全部数字和的操作。
第四分钟,彩虹喵说,要基于二叉树的数据结构,于是便有了数据范围。
第五分钟,和雪说,要有耐心,于是便有了时间限制。
第六分钟,吃钢琴男说,要省点事,于是便有了保证运算过程中及最终结果均不超过32位有符号整数类型的表示范围的限制。
第七分钟,这道题终于造完了,然而,造题的神牛们再也不想写这道题的程序了。”
——《上帝造裸题的七分钟》 所以这个神圣的任务就交给你了。
Input
输入数据的第一行为
X n m,代表矩阵大小为\(n \times m\)。
从输入数据的第二行开始到文件尾的每一行会出现以下两种操作:
L a b c d delta—— 代表将\((a,b),(c,d)\)为顶点的矩形区域内的所有数字加上delta。k a b c d—— 代表求\((a,b),(c,d)\)为顶点的矩形区域内所有数字的和。请注意,\(k\)为小写。
Output
针对每个k操作,在单独的一行输出答案。
裸的二维树状数组问题.
二维前缀和:
\]
考虑差分:
\]
此时小推一下式子即可.
区间修改,区间查询:
\]
这个时候记录每个位置的\(d[h][k]\)出现了几次.
所以式子变形得到.
\]
然后把式子展开.就变成这个
\]
然后四个树状数组数组分别维护这些东西:
\(d[i][j],d[i][j]\times i ,d[i][j] \times j,d[i][j] \times i\times j\)
代码
#include<cstdio>
#include<cctype>
#define N 2050
#define R register
using namespace std;
inline void in(int &x)
{
int f=1;x=0;char s=getchar();
while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
while(isdigit(s)){x=x*10+s-'0';s=getchar();}
x*=f;
}
int t1[N][N],t2[N][N],t3[N][N],t4[N][N],n,m;
#define lowbit(x) x&-x
inline void add(int x,int y,int del)
{
for(R int i=x;i<=n;i+=lowbit(i))
for(R int j=y;j<=m;j+=lowbit(j))
{
t1[i][j]+=del;
t2[i][j]+=del*x;
t3[i][j]+=del*y;
t4[i][j]+=del*x*y;
}
}
inline void ado(int xa,int ya,int xb,int yb,int z)
{add(xa,ya,z);add(xa,yb+1,-z);add(xb+1,ya,-z);add(xb+1,yb+1,z);}
inline int que(int x,int y)
{
R int res=0;
for(R int i=x;i;i-=lowbit(i))
for(R int j=y;j;j-=lowbit(j))
res+=(x+1)*(y+1)*t1[i][j]-(y+1)*t2[i][j]-(x+1)*t3[i][j]+t4[i][j];
return res;
}
inline int query(int xa,int ya,int xb,int yb)
{return que(xb,yb)-que(xb,ya-1)-que(xa-1,yb)+que(xa-1, ya-1);}
char s[6];
int main()
{
in(n),in(m);
for(R int a,b,c,d,x;~scanf("%s",s+1);)
{
in(a),in(b),in(c),in(d);
if(s[1]=='L')in(x),ado(a,b,c,d,x);
else printf("%d\n",query(a,b,c,d));
}
}
二维树状数组+差分【p4514】上帝造题的七分钟的更多相关文章
- POJ2155/LNSYOJ113 Matrix【二维树状数组+差分】【做题报告】
这道题是一个二维树状数组,思路十分神奇,其实还是挺水的 题目描述 给定一个N∗NN∗N的矩阵AA,其中矩阵中的元素只有0或者1,其中A[i,j]A[i,j]表示矩阵的第i行和第j列(1≤i,j≤N)( ...
- 【树状数组】BZOJ3132 上帝造题的七分钟
3132: 上帝造题的七分钟 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1004 Solved: 445[Submit][Status][Dis ...
- hdu 2642二维树状数组 单点更新区间查询 模板题
二维树状数组 单点更新区间查询 模板 从零开始借鉴http://www.2cto.com/kf/201307/227488.html #include<stdio.h> #include& ...
- Codeforces Round #439 (Div. 2) Problem E (Codeforces 869E) - 暴力 - 随机化 - 二维树状数组 - 差分
Adieu l'ami. Koyomi is helping Oshino, an acquaintance of his, to take care of an open space around ...
- P4514 上帝造题的七分钟(二维树状数组)
P4514 上帝造题的七分钟 二维树状数组 差分维护区间加法,区间求和 #include<cstdio> int read(){ ,f=; ') f=f&&(c!='-') ...
- BZOJ2738矩阵乘法——整体二分+二维树状数组
题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入 第一行两个数N,Q,表示矩阵大小和询问组数:接下来N行N列一共N*N个数,表示这个矩阵:再接下来Q行每行5 ...
- PKU 2155 Matrix(裸二维树状数组)
题目大意:原题链接 题意很简单,就不赘诉了. 解题思路: 使用二维树状数组,很裸的题. 二维的写起来也很方便,两重循环. Add(int x,int y,int val)表示(x,y)-(n,n)矩形 ...
- [luogu] P4514 上帝造题的七分钟 (树状数组,二维差分)
P4514 上帝造题的七分钟 题目背景 裸体就意味着身体. 题目描述 "第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a ...
- 二维树状数组总结&&【洛谷P4514】 上帝造题的七分钟
P4514 上帝造题的七分钟 题目描述 "第一分钟,X说,要有矩阵,于是便有了一个里面写满了00的n×mn×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b)(a,b),右下 ...
随机推荐
- npm错误总结
You cannot publish over the previously published version 1.0.1." : xxx 发布时一定要修改package.json的版本号 ...
- gitlab之:gitlab 403 forbidden 并发引起ip被封
步骤: * 打开/etc/gitlab/gitlab.rb文件. * 查找gitlab_rails['rack_attack_git_basic_auth']关键词. * 取消注释 * 修改ip_wh ...
- 马上给Meltdown和Spectre漏洞打补丁
元旦之后的第一个工作日可谓是惊喜不断,4号就传来了 Google Project Zero 等团队和个人报告的 Meltdown 和 Spectre 内核漏洞的消息,首先简单介绍一下这两个内核漏洞. ...
- iOS 快速框架搭建项目
项目目录 Pod第三方 gitHub地址 https://github.com/henusjj/Basic-project-framework
- Android百度定位API的使用
导入库文件 在下载页面下载最新的库文件.将liblocSDK2.4.so文件拷贝到libs/armeabi目录下.将locSDK2.4.jar文件拷贝到工程根目录下,并在工程属性->Java B ...
- nginx proxy_buffer_size 解决后端服务传输数据过多,其实是header过大的问题
nginx proxy_buffer_size 解决后端服务传输数据过多,其实是header过大的问题 这三个参数已设置就搞定了额 proxy_buffer_size 64k; proxy_buffe ...
- POJ 3070 + 51Nod 1242 大斐波那契数取余
POJ 3070 #include "iostream" #include "cstdio" using namespace std; class matrix ...
- 线段树+矩阵快速幂 Codeforces Round #373 (Div. 2) E
http://codeforces.com/contest/719/problem/E 题目大意:给你一串数组a,a[i]表示第i个斐波那契数列,有如下操作 ①对[l,r]区间+一个val ②求出[l ...
- SPOJ 1182 Sorted bit sequence
题目链接 题意: 分析: 其实如果会了Ural 1057. Amount of Degrees那道题目,这道题自然也就会了... 我们考虑枚举第$k$个数字的$1$的个数,那么我们需要计算的也就是区间 ...
- [BZOJ2502]清理雪道解题报告|带下界的最小流
滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向. 你的团队负责每周定时清理雪道.你们拥有一架直升飞机,每次飞 ...