Hihocoer 1336 - Matrix Sum 二维树状数组

题意

给我们个n*n的矩阵 有m个操作让我们
操作有两种 
Add x y v对(x,y)上的元素加v
Sum x1 y1 x2 y2 对(x1,y1)为左上角(x2,y2)为右下角的矩阵求和并mod 1e9+7
初始矩阵每个元素都是0
1 ≤ N ≤ 1000, 1 ≤ M ≤ 100000
For each Add operation: 0 ≤ x < N, 0 ≤ y < N, -1000000 ≤ value ≤ 1000000
For each Sum operation: 0 ≤ x1 ≤ x2 < N, 0 ≤ y1 ≤ y2 < N 

分析

二维树状数组
操作数量巨大 不可能承受 O(M^2) 也就是如果要是我们把操作序列保存的话
假设有10000 * 10000 一万个add一万个sum那么一个数据点就会超时
那么我们来看如果只是一维的话 求两个位置间的和我们可以用前缀和
那么二维的话 我们很难在高效的时间内求出关于这个矩阵的前缀和
我们再来看 有什么数据结构可以在logn内求的数据区间之间的和呢?
可以用树状数组或是线段数
那么树状数组只能求线性结构的
这里可以考虑二维树状数组
也就是x方向一维
y方向又是一维 
两维建立树状数组t[x][y],也就是保存(1,1)到(x,y)矩阵和
对(x1,y1)为左上角(x2,y2)为右下角的矩阵求和也就是sum(x2+1,y2+1)-sum(x2+1,y1)-sum(x1,y2+1)+sum(x1,y1) 大矩阵-小矩阵右边的和-小矩阵下面的和+小矩阵和
加一是为了满足树状数组不可以对0,0点求和 所以要全部+1操作

CODE

#include<bits/stdc++.h>
using namespace std;
const int mod = 1e9+7;
typedef long long ll;
ll a[1010][1010];
int n,m;
void add(int x,int y,int v){for(int i=x;i<=n;i+=i&(-i)){//lowbit操作for(int j=y;j<=n;j+=j&(-j)){a[i][j]+=v;}}
}
ll sum(int x,int y){ll s=0;for(int i=x;i>0;i-=i&(-i)){for(int j=y;j>0;j-=j&(-j)){s+=a[i][j];         }}return s;
}
int main()
{scanf("%d%d",&n,&m);while(m--){char o[5];scanf("%s",o);if(o[0]=='A'){int x,y,v;scanf("%d%d%d",&x,&y,&v);add(x+1,y+1,v);     } else{int x1,x2,y1,y2;scanf("%d%d%d%d",&x1,&y1,&x2,&y2);printf("%lld\n",(sum(x2+1,y2+1)-sum(x2+1,y1)-sum(x1,y2+1)+sum(x1,y1)+mod)%mod); }//同余 由于一个负数对正数mod取余一定是个负数 mod内的负数+mod也就是相当于mod-负数和 得到mod对这个负数和的补数 //这个负数对mod求余 也就是这个负数的倒数 对mod求余 } return 0;
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java学习笔记13-1——SpringMVC

文章目录1.什么是MVC回顾Servlet2.什么是SpringMVC概述中心控制器SpringMVC执行原理3.第一个SpringMVC 程序使用XML配置实现使用注解实现4.控制器和RestFul风格控制器Controller实现Controller接口使用注解ControllerRequestMappingRestFul 风格扩展&#xff1a;小黄鸭调试法5.…

端口占用怎么查找

D:\Users\hp\Documents\NetBeansProjects\WebApplication1\nbproject\build-impl.xml:1030: Deployment error: Starting of Tomcat failed, the server port 8080 is already in use. netstat -aon|findstr "8080" 查看端口 查看端口的进程 记住3306 tasklist|fi…

数据库相关

https://blog.csdn.net/qq_35246620/article/details/70823903 瞻仰大佬的博客,,学习学习 转载于:https://www.cnblogs.com/wangxiaoshou/p/10483428.html

eclipse没有server怎么办

1打开eclipse 找到help 2点开&#xff0c;查找 Install new software 二步、然后在Work with中点击Add&#xff0c;如下图所示&#xff0c;加入Name"Kepler" repository&#xff1b;Locationhttp://download.eclipse.org/releases/kepler。 3填写完成后使用add 4第…

HDU - 5441 Travel 离线处理+并查集

题意 给我们一个图 给出这个图的n个点 和m个边和权值 然后再分别给我们q个查询 每个查询给一个x 让我们在这个图中找出多少个不同的有序对 使得从x到y的最大权值不超过x n≤20000,m≤100000,q≤5000. 分析 20000个点 1000ms 暴力肯定不行 看似这道题像是个图论的题 嘿嘿嘿 其…

zabbix利用SNMPTrap接收交换机主动告警

zabbix接收trap的工作流程&#xff1a; snmptrapd 收到trapsnmptrapd将trap传递给SNMPTT或调用Perl接收器SNMPTT或Perl trap接收器解析&#xff0c;格式化并将trap写入文件Zabbix SNMP trap读取并解析trap文件对于每个trap&#xff0c;Zabbix发现主机接口与接收的trap地址匹配的…

eclipse安装jsp

1打开window中preferences 2找到server下runningtime 3add 4选择 5加入 6找到 7建立一个新jsp文件

03-java学习-基本数据类型-运算符-键盘接收用户输入

java的八大基本数据类型&#xff1a; 类型转换的基本原则&#xff1a; java整数的默认类型是int&#xff0c;小数的默认类型是double 运算符&#xff1a; 算术运算符、连接、赋值、关系、逻辑、三目运算符等…… 键盘接收用户输入&#xff1a; java.util.Scanner类的了解和使用…

POJ-1651 Multiplication Puzzle 矩阵连乘问题(区间dp)

题意 给我们n个数 让我们随意的跳出其中的数 每挑出一个数 计算代价为左边数* 当前数 * 右边的数 除了首尾两个数不选 中间的数可以任意挑 让我们求最小代价 CODE #include<bits/stdc.h> using namespace std; int a[110],m[110][110]; const int maxn 0x7f7f7f; in…

The Apache Tomcat installation at this directory is version,tomcat

The Apache Tomcat installation at this directory is version,tomcat版本号过高eclipse无法导入解决办法 找到tomcat安装位置进入lib目录 lib目录下有个catalina.jar 用解压缩软件打开 打开后 在catalina.jar\org\apache\catalina\util目…

9.JSP运行原理与JSP页面的基本结构

JSP运行原理与JSP页面的基本结构 HTML页面的基本构成 .代码中出现的几种标签 •单标签 某些标签只需单独使用就能完整地表达意思&#xff0c;控制网页 效果&#xff0c;这类标签的语法是&#xff1a; <标签> 双标签 标签成对使用&#xff0c;由一个开始标签和一个结…

给定两个整数m和n,求出m~n这段连续的整数中所有偶数的平方和以及所有奇数的立方和。

//自己留着复习用 #include<stdio.h> int s(int a) { if (a%20) return aa; else return aa*a;} int main () {int i,m,n,s1,s2; scanf("%d %d",&m,&n);s1s20; for(im;i<n;i) { if(i%20) s1s1s(i); else s2s2s(i);} printf("%d %d",s…

[Leedcode][JAVA][第124题][二叉树中的最大路径和][递归][二叉树]

【问题描述】[困难] 给定一个非空二叉树&#xff0c;返回其最大路径和。本题中&#xff0c;路径被定义为一条从树中任意节点出发&#xff0c;达到任意节点的序列。该路径至少包含一个节点&#xff0c;且不一定经过根节点。示例 1:输入: [1,2,3]1/ \2 3输出: 6 示例 2:输入: …

SAS对数据变量的处理

SAS对数据变量的处理 在使用DATA步基于已经存在的数据集生成新数据集时&#xff0c;可以指定在新数据集中不需要包含的变量而仅读取其他变量&#xff0c;或者指定仅需要在 新数据集中包含的变量。该功能可以通过DATA步中的SET语句和数据集选项KEEP和DROP来实现&#xff0c;也可…

用类来实现输入输出时间,定义多个类对象分别输入输出各对象的时间(时:分:秒),使用函数,数据成员不再由键盘输入,而在调用函数时由实参给出,并在函数中使用默认参数

//个人留着复习用 #include using namespace std; class Time {public: int hour; //类 int minute; int sec; }; int main() {void settime(Time&,int hour0,int minute0,int sec0); //函数声明&#xff0c;制定了默认参数 void showtime(Time&); //函数声明 Tim…

POJ 2533 Longest Ordered Subsequence 动态规划

题意 本题求从1 到 n的最长上升子序列的长度 分析 最优化问题 考虑dp 我们求1-n最长上升子序列长度 假设记录在dp[n]中 假设我们已经知道了1—n-1的以第n-1为最后一个元素的最长上升序列的长度 那么我们拿到第n个元素不就可以判断如果这个n比n-1位置上的元素大 那么就…

那些ubuntu创建用户踩过的坑

在ubuntu中应该用adduser命令创建用户&#xff0c;而不是使用useradd. 各种Linux发行版是有差别的&#xff0c;我也是刚用过才知道的。转载于:https://www.cnblogs.com/April315/p/10496745.html

[剑指offer][JAVA]面试题第[30]题[包含min函数的栈][双栈辅助栈][单栈]

【问题描述】[中等] 定义栈的数据结构&#xff0c;请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中&#xff0c;调用 min、push 及 pop 的时间复杂度都是 O(1)。示例:MinStack minStack new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-…