网站大量收购闲置独家精品文档,联系QQ:2885784924

25、肖恩的投球游戏加强版.docx

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

解题思路

本题需要求解在一个?n×m?的矩阵球筐中,每个格子最开始的球的个数为?ai,j。进行?q?次操作后,每个格子的球的个数。每次操作给出五个整数?cx1,y1,x2,y2,c,表示以(x1,y1)?为左上角(x2,y2)?为右下角的子矩阵的所有格子都投入?c?个球。为了解决这个问题,我们可以使用二维差分的方法。

二维差分定义和推导过程

二维差分数组是一种用于记录矩阵局部区域的变化的数组。设有一个矩阵?aa,我们定义差分数组?s?如下:

si,j=ai,j?ai?1,j?ai,j?1+ai?1,j?1

这里的差分数组记录了从矩阵的?(1,1)?到?(i,j)?的矩形区域所发生的变化。

对于本题,我们需要在一个子矩阵中同时修改多个格子的值。差分数组的优势在于,我们可以通过修改差分数组的边界值,来实现对子矩阵内所有格子的值的同时修改。

具体地,当我们需要给子矩阵(x1,y1)?到(x2,y2)?中的每个格子都加上?cc?时,我们可以对差分数组进行如下操作:

s_{x_1,y_1}+=csx1,y1+=c

s_{x_1,y_2+1}-=csx1,y2+1?=c

s_{x_2+1,y_1}-=csx2+1,y1?=c

s_{x_2+1,y_2+1}+=csx2+1,y2+1+=c

经过这样的操作,我们实际上在差分数组中标记了一个子矩阵区域的变化。最后,我们需要根据差分数组恢复原矩阵,以得到最终每个格子的球的个数。

恢复原矩阵的方法如下:

ai,j=ai?1,j+ai,j?1?ai?1,j?1+si,j

可以看到,恢复原矩阵的过程是通过累加差分数组的值来完成的。

实现和复杂度分析

根据上述方法,我们可以实现如下算法:

初始化矩阵?aa?和差分数组?ss;

读入矩阵?aa?的初始值,并更新差分数组?ss;

进行?qq?次操作,每次操作根据给定的子矩阵边界和?cc,更新差分数组?ss;

根据差分数组?ss?恢复原矩阵?aa;

输出原矩阵?aa。

算法的时间复杂度为?O(nm+q),因为我们需要遍历整个矩阵,然后进行?q?次操作。每次操作的时间复杂度为常数级别,因为我们只需要修改差分数组的边界值。

AC_Code

C++

#includebits/stdc++.h

usingnamespacestd;

typedeflonglongLL;

constintN=1010;

LLa[N][N],s[N][N];

intn,m,q;

voidinsert(intx1,inty1,intx2,inty2,intc){

s[x1][y1]+=c;

s[x1][y2+1]-=c;

s[x2+1][y1]-=c;

s[x2+1][y2+1]+=c;

}

intmain(){

ios_base::sync_with_stdio(false);

cin.tie(0);cout.tie(0);

cinnmq;

for(inti=1;i=n;++i){

for(intj=1;j=m;++j){

cina[i][j];

insert(i,j,i,j,a[i][j]);

}

}

while(q--0){

intx1,y1,x2,y2,c;

cinx1y1x2y2c;

insert(x1,y1,x2,y2,c);

}

//求原数组

for(inti=1;i=n;i++){

for(intj=1;j=m;j++){

a[i][j]=a[i-1][j]+a[i][j-1]-a[i-1][j-1]+s[i][j];

couta[i][j];

}

cout\n;

}

return0;

}

Java

importjava.io.*;

importjava.util.*;

publicclassMain{

staticfinalintN=1010;

staticlong[][]a=newlong[N][N];

staticlong[][]s=newlong[N][N];

文档评论(0)

如此醉 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档