2017西安交大ACM小学期数据结构 [分块、二维矩阵]

Problem B

发布时间: 2017年6月28日 10:06   最后更新: 2017年6月28日 16:35   时间限制: 2000ms   内存限制: 32M

给定一个n×m的矩形, 其中第i行第j列的值为ai,j

给出q个操作, 操作有两种

对于形如1 x1 y1 x2 y2 z 的操作, 将(x1,y1)-(x2,y2)这段矩形区域的所有元素加上z, 满足1x1x2n1y1y2m1z105

对于形如2 x y的操作, 输出ax,y, 满足1xn1ym

998n1000998m10009×104q1051ai,j105

第一行三个整数nmq, 意义如上所述。
接下来n行, 每行m个整数, 表示序列a
再接下来q行, 每行第一个数为opt, 如果opt=1, 则后面紧跟五个数, 意义如上所述; 如果opt=2, 则后面紧跟两个数, 意义如上所述。

对于所有操作2, 输出答案, 一行一个。

 复制
3 4 3
3 1 4 1
5 9 2 6
5 3 5 8
2 2 2
1 1 1 3 4 6
2 2 2
9
15

题解:

这道题目给出的操作是对要做区间修改,端点查询。我们可以仿照《数据结构训练1》的思路,构造出一个序列b,然后单点查询变成了对序列b进行求和,区间修改变成了

对序列b进行的单点修改。

经过尝试,我们定义b[i][j] = a[i][j]+a[i-1][j-1]-a[i][j-1]-a[i-1][j]

这样的话 sum(b[i][j])就等于a[i][j]

而我们对于区间x1,y1,x2,y2进行修改(加上在z)就相当于

在点b[x1][y1]处加上z

在b[x1][y2+1]处减去z

在b[x2+1][y1]处减去z

在b[x2+1][y2+1]处加上z

做以上4步操作。


这样的话求和就很简单了,现在可以用两种方法来实现求和

比较简单的一种想法是用二维树状数组来维护,这里就不多说了。

还有一种思路就是用分块的方法,在O(q(sqrt n*m))的复杂度内完成

由于二维矩阵在分块上比较复杂。

我们转向对询问进行分块。

每块地大小是s = sqrt(n*m)

每经过s个询问,我们都要对b数组和sum数组进行重构。

时间复杂度就是O(q(sqrt n*m))

代码:

#include <cstdio>
#include <cmath>
const int MAX = 1007;
typedef long long LL; 
LL cx1[100007];
LL cy1[100007];
LL cx2[100007];
LL cy2[100007];
LL cv[100007];
LL arr[MAX][MAX];
LL brr[MAX][MAX];
LL sum2[MAX][MAX];
LL tot = 0;
LL las = 0;
LL n,m,q;
LL s;
void cg(LL x1,LL y1,LL x2,LL y2,LL val){cx1[tot] = x1;cy1[tot] = y1;cx2[tot] = x2;cy2[tot] = y2;cv[tot] = val;tot ++;if(las + s == tot ){//重构 for(LL i = las;i < tot;i++){brr[cx1[i]][cy1[i]] += cv[i];brr[cx2[i]+1][cy2[i]+1] += cv[i];brr[cx1[i]][cy2[i]+1] -= cv[i];brr[cx2[i]+1][cy1[i]] -= cv[i];}las = tot;for(LL i = 1;i <= n;i++){for(LL j = 1;j <= m;j++){sum2[i][j] = sum2[i][j-1] + sum2[i-1][j] - sum2[i-1][j-1] + brr[i][j];}} }
}
LL sums(LL x,LL y){LL res = sum2[x][y];for(LL i = las;i < tot;i++){if(cx1[i] <= x  && x <= cx2[i] && cy1[i] <= y && y <= cy2[i]){res += cv[i];}}return res;
}int main(){//freopen("2.in","r",stdin);//freopen("2.out","w",stdout);scanf("%lld%lld%lld",&n,&m,&q);s = (LL)sqrt(n*m);for(LL i = 1;i <= n;i++){for(LL j = 1;j <= m;j++){scanf("%lld",&arr[i][j]);}}for(LL i = 1;i <= n;i++){for(LL j = 1;j <= m;j++){brr[i][j] = arr[i][j] + arr[i-1][j-1] - arr[i][j-1] - arr[i-1][j];}}for(LL i = 1;i <= n;i++){for(LL j = 1;j <= m;j++){sum2[i][j] = sum2[i][j-1] + sum2[i-1][j] - sum2[i-1][j-1] + brr[i][j];}} while(q--){LL opt;scanf("%lld",&opt);if(opt == 2){//查询  LL a,b;scanf("%lld%lld",&a,&b);printf("%lld\n",sums(a,b));sums(a,b);}else if(opt == 1){LL a,b,c,d,z;scanf("%lld%lld%lld%lld%lld",&a,&b,&c,&d,&z);cg(a,b,c,d,z);}}return 0;} 
/*
2 2 4
1 1 
1 1
1
1 1 1 1 10
1
2 2 2 2 10
2
1 1 
2
2 2
*/



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

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

相关文章

18、java中的泛型

之前介绍集合时&#xff0c;可以看到有List<String>这样的写法&#xff0c;那么尖括号里的内容是什么呢&#xff1f;这是泛型&#xff0c;意思就是说声明的这个List集合只能存放String类型的元素。 泛型是什么&#xff1f; ‘泛’指一般、不深入&#xff0c;在这里可以认…

编写一个Java程序,其中包含三个线程: 厨师(Chef)、服务员(Waiter)和顾客(Customer)

编写一个Java程序&#xff0c;其中包含三个线程: 厨师(Chef)、服务员(Waiter)和顾客(Customer)。他们的行动如下: 厨师准备菜肴&#xff0c;每次准备一个。服务员等待菜肴准备好&#xff0c;然后将其送到顾客那里。顾客等待服务员送来菜看后才开始吃。所有三个角色应该循环进行…

U86650-群鸡乱舞【矩阵乘法】

正题 题目链接:https://www.luogu.org/problem/U86650?contestId23574 题目大意 第一年有nnn只鸡&#xff0c;每只大于等于两岁的鸡每年可以生一只&#xff0c;在ttt岁时不会生鸡而会暴毙。 现在给出每只鸡的年龄&#xff0c;求第mmm年鸡的总数量。 解题思路 用fif_{i}fi​…

2017西安交大ACM小学期数据结构 [线段树]

Problem B 发布时间: 2017年7月1日 02:08 最后更新: 2017年7月1日 02:10 时间限制: 1000ms 内存限制: 64M 描述 给定一个长度为n的序列a1, a2, ..., an, 满足这个序列是一个1~n的排列 如果一个序列满足: 将序列排序后, 任意两个相邻的元素的差为1, 那么就称这个序列为&qu…

19、java中枚举

枚举是什么&#xff1f; 枚举就是将一个有限集合中的所有元素列举出来&#xff0c;在java中使用可以使用enum关键字来声明一个枚举类。 为什么使用枚举&#xff1f; 之前当用到一些常量时&#xff0c;便临时声明一个&#xff0c;这样使得代码看起来很乱&#xff0c;这里一个…

Hangfire使用ApplicationInsigts监控

起因我司目前使用清真的ApplicationInsights来做程序级监控。&#xff08;ApplicationInsights相关文档: https://azure.microsoft.com/zh-cn/services/application-insights/ &#xff09;其实一切都蛮好的&#xff0c;但是我们基于Hangfire的Job系统却无法被Ai所监控到&#…

nssl1446-小智的旅行【dp】

正题 题目大意 求一条最大的权值严格上升的路径。 解题思路 将边权排序&#xff0c;然后从fxf_xfx​转移到fy1f_y1fy​1即可&#xff0c;要注意的是因为严格上升&#xff0c;所以此次转移用的fff不能是相同权值转移时转移的。 codecodecode #include<cstdio> #include…

2017西安交大ACM小学期数据结构 [树状数组]

Problem C 发布时间: 2017年6月28日 11:38 最后更新: 2017年6月28日 16:38 时间限制: 1000ms 内存限制: 32M 描述 给定一个长度为n的序列a1, a2, ..., an, 其中ai∈[1,10]给出q个操作, 操作分为两种 对于形如1xy的操作, 将ax改为y, 满足1≤x≤n, 1≤y≤10对于形如2xyz的操…

NET主流ORM框架分析

接上文我们测试了各个ORM框架的性能&#xff0c;大家可以很直观的看到各个ORM框架与原生的ADO.NET在境删改查的性能差异。这里和大家分享下我对ORM框架的理解及一些使用经验。ORM框架工作原理所有的ORM框架的工作原理都离不开下面这张图&#xff0c;只是每个框架的实现程度不同…

20、java中的类加载机制

1、类加载机制是什么&#xff1f; 类加载机制指的就是jvm将类的信息动态添加到内存并使用的一种机制。 2、那么类加载的具体流程是什么呢&#xff1f; 一般说类加载只有三步&#xff1a;加载、连接和初始化&#xff0c;其中连接包括验证、准备和解析&#xff0c;用于将运行时加…

nssl1447-小智的糖果【dp】

正题 题目大意 长度为nnn的序列&#xff0c;mmm个位置要求两边都比他大&#xff0c;kkk个位置要求两边都比他小。求序列个数。 解题思路 若第xxx个位置为山峰&#xff0c;那么ax−1<ax>ax1a_{x-1}<a_x>a_{x1}ax−1​<ax​>ax1​&#xff0c;我们用upiup_iu…

21、java中的反射机制

先推荐安装一个 eclipse 的反编译插件 Enhanced Class Decompiler 是什么&#xff1f; 在说反射之前先说一下编译时类型和运行时类型&#xff0c;大家都知道List是一个接口&#xff0c;它是不可以被实例化的&#xff0c;但是可以通过多态实现&#xff1a;List list new Arra…

【北京】BXUG第12期活动基于 .NET Core构建微服务和Xamarin

分享主题&#xff1a;基于 .NET Core构建微服务实战分享分享者&#xff1a;薛锋 北京切尔思科技架构师 兼任东北大学信息安全工程师和技术主播&#xff0c;行业内专注于研究 .NET Core和Web应用&#xff0c;具有比较扎实的技术基础和数年的从业经历。在GitHub上主持数个开…

2017西安交大ACM小学期数据结构 [树状数组,极大值]

Problem D 发布时间: 2017年6月28日 10:51 最后更新: 2017年6月28日 16:38 时间限制: 1000ms 内存限制: 32M 描述 给定一个长度为n的序列a1, a2, ..., an当k满足2≤k≤n−1, ak>ak−1且ak>ak1时, 将元素k称为极大值点, 给出q个操作, 操作分为两种 对于形如1xy的操作…

nssl1448-小智过马路【模拟】

正题 题目大意 nnn个横向道&#xff0c;若干辆车&#xff0c;每辆车速度恒定&#xff0c;给出方向位置长度。 过马路的速度&#xff0c;最早开始时间&#xff0c;最晚开始时间。求最长的可以通过马路的时间段。 解题思路 计算出每辆车限制的时间区间&#xff0c;然后排序找到…

22、java中的注解

注解是什么&#xff1f; 注解可以理解成注释、标记、标签的意思&#xff0c;用来标记类、方法等。就相当于现实生活中的一些事物&#xff0c;上边贴一个标签或者写一些注释性文字来描述它可以用来做什么、怎么用、何时用等信息。Java中的注解也是一样的&#xff0c;用来表示被标…

谈谈ASP.NET Core中的ResponseCaching

前言前面的博客谈的大多数都是针对数据的缓存&#xff0c;今天我们来换换口味。来谈谈在ASP.NET Core中的ResponseCaching&#xff0c;与ResponseCaching关联密切的也就是常说的HTTP缓存。在阅读本文内容之前&#xff0c;默认各位有HTTP缓存相关的基础&#xff0c;主要是Cache-…

2017西安交大ACM小学期数据结构 [树状数组 离散化]

Problem E 发布时间: 2017年6月28日 12:53 最后更新: 2017年6月29日 21:35 时间限制: 1000ms 内存限制: 64M 描述 给定一个长度为n的序列a1, a2, ..., an给定两个整数L, R输出有多少个二元组(x,y),x≤y, 满足L≤∑yixai≤R9104≤n≤105, −109≤ai≤109, −109≤L≤R≤10…

使用 dynamic 类型让 ASP.NET Core 实现 HATEOAS 结构的 RESTful API

上一篇写的是使用静态基类方法的实现步骤: 使用dynamic (ExpandoObject)的好处就是可以动态组建返回类型, 之前使用的是ViewModel, 如果想返回结果的话, 肯定需要把ViewModel所有的属性都返回, 如果属性比较多, 就有可能造成性能和灵活性等问题. 而使用ExpandoObject(dynamic)就…

23、java中的网编基础

什么是网络编程&#xff1f; 在说网络编程之前要先知道什么是网络&#xff0c;网络是一种实现资源共享和数据传输的系统。而网络编程就是使用代码编写程序来进行网络之间数据的传输。使用java进行网络之间数据的传输是比较简单的&#xff0c;java中提供了一些现成的类供我们使…