Codeforce s Round 920 (Div. 3) G题 旋转矩阵,斜缀和,平移

Problem - G - Codeforces

目录

题意:

思路:

总思路:

旋转矩阵:

前缀和预处理:

平移的处理,尤其是越界的处理:

核心代码:


题意:

给你个n*m的矩阵,里面要么是目标' # ',要么是空的' . '。

还有值k,代表这样的范围:

我们有四个方向可选。图中黑点即是我们落脚点,可以随意选,要使黑色区域的目标'#'最多,输出这个最大值

思路:

总思路:

‘#’是随机给的,我们只能暴力。暴力上做优化即可。

如果这四种都做,代码是类同但细节处理太多,而只用一种方向然后旋转矩阵这样是等价的。

我们选择第三种,使用前缀和(列缀和,斜缀合)方便:

由于面积可能很大,每个落脚点都数时间消耗太多。我们可以发现相邻的是平移过去的,只差一列和斜着一列:

所以我们对上次的‘#’数目,加上这列的'#'数目,再减去斜着的'#'数目,就是这次的'#'数目了。

预处理出前缀和,这样平移时加的减的都可以直接算出来。(越界的处理需要注意)

旋转矩阵:

(这个C语言OJ就写过。我好像有一次没写出来,然后就有了心理阴影,其实很好写)

我们再创个二维char数组next,把旋转的写进这个数组,然后覆盖原数组即可。

我们可以借助个例子去想,比如顺时针旋转:

1 2 3 4      5 1		
5 6 7 8	     6 27 38 4

我们可以发现第一行变成了倒数第一列,而原来的列数变成了新的行数。

所以next[ j ][ chars.size()-1-i ] = chars[ i ][ j ]        (chars就是原始图)

vector<vector<char>>next(chars[0].size(), vector<char>(chars.size()));
for (int i = 0; i < chars.size(); i++)
{for (int j = 0; j < chars[0].size(); j++){next[j][chars.size()-1 - i] = chars[i][j];}
}
chars = next;

(注意新的图的n和m是变的。)

前缀和预处理:

可能没写过斜缀和。然后下标可以从1开始,我是写的从0开始的。

	int t = 4;while (t--){n = chars.size(), m = chars[0].size();vector<vector<int>>narr(n, vector<int>(m)), rd(n, vector<int>(m));for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){if (i > 0)narr[i][j] = narr[i - 1][j] + (chars[i][j] == '#');elsenarr[i][j] = chars[i][j] == '#';}}for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){if(i>0&&j>0)rd[i][j] = rd[i - 1][j - 1] + (chars[i][j] == '#');elserd[i][j] = chars[i][j] == '#';}}

平移的处理,尤其是越界的处理:

for (int i = 0; i < n; i++)
{int tmp = narr[min(i + k, n - 1)][0] - (i - 1 >= 0 ? narr[i - 1][0] : 0);ans = max(ans, tmp);for (int j = 1; j < m; j++)//右平移{//x,y:前一个位置最下面那个点int x = i + k, y = j-1;if (x >= n){y -= x - (n - 1);x = n - 1; }tmp += narr[min(i+k,n-1)][j] - (i - 1 >= 0 ? narr[i - 1][j] : 0);if(y>=0)tmp	-= rd[x][y] - (j - 1 - k - 1 >= 0&&i-1>=0 ? rd[i - 1][j - 1 - k - 1] : 0);ans = max(ans, tmp);}
}

代码中x,y就是1点。

1的列缀合-2的列缀合就是新增的'#'

3的斜缀合-4的斜缀合就是失去的'#'

最难处理的就是3越界后的斜缀合:

我们可以发现,不管下面什么情况越界,最后一行都是n-1。我们取n-1对应着的斜缀合即可。

x,y仍代表1点(见上面),(x,y-1)就是原来的斜缀合的点,现在往左上角移动了,行的变换数是等于列的变换数的,而行变换(x-(n-1)),那么列也减去这个,即行为n-1,列为y-1 - (x-(n-1))。

其余的越界是好处理的,代码里有我的处理情况。

核心代码:

void solve()
{int n, m, k;cin >> n >> m >> k;vector<vector<char>>chars(n, vector<char>(m));for (int i = 0; i < n; i++)for (int j = 0; j < m; j++)cin >> chars[i][j];int ans = 0;int t = 4;while (t--){n = chars.size(), m = chars[0].size();vector<vector<int>>narr(n, vector<int>(m)), rd(n, vector<int>(m));for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){if (i > 0)narr[i][j] = narr[i - 1][j] + (chars[i][j] == '#');elsenarr[i][j] = chars[i][j] == '#';}}for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){if(i>0&&j>0)rd[i][j] = rd[i - 1][j - 1] + (chars[i][j] == '#');elserd[i][j] = chars[i][j] == '#';}}for (int i = 0; i < n; i++){int tmp = narr[min(i + k, n - 1)][0] - (i - 1 >= 0 ? narr[i - 1][0] : 0);ans = max(ans, tmp);for (int j = 1; j < m; j++)//右平移{//x,y:前一个位置最下面那个点int x = i + k, y = j-1;if (x >= n){y -= x - (n - 1);x = n - 1; }tmp += narr[min(i+k,n-1)][j] - (i - 1 >= 0 ? narr[i - 1][j] : 0);if(y>=0)tmp	-= rd[x][y] - (j - 1 - k - 1 >= 0&&i-1>=0 ? rd[i - 1][j - 1 - k - 1] : 0);ans = max(ans, tmp);}}vector<vector<char>>next(chars[0].size(), vector<char>(chars.size()));for (int i = 0; i < chars.size(); i++){for (int j = 0; j < chars[0].size(); j++){next[j][chars.size()-1 - i] = chars[i][j];}}chars = next;}cout << ans << endl;
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t; cin >> t;while (t--){solve();}return 0;
}

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

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

相关文章

[自动化分布式] Zabbix自动发现与自动注册

abbix 自动发现&#xff08;对于 agent2 是被动模式&#xff09; zabbix server 主动的去发现所有的客户端&#xff0c;然后将客户端的信息登记在服务端上。 缺点是如果定义的网段中的主机数量多&#xff0c;zabbix server 登记耗时较久&#xff0c;且压力会较大 部署 添加zabb…

漏洞扫描的原理是什么,分为几个阶段进行

网络漏洞扫描主要通过扫描已知的网络缺陷、不正确的网络设置和过时的网络应用版本来检测漏洞。漏洞扫描主要分为哪三个阶段&#xff1f;对于企业来说&#xff0c;创建持续监控容器并查找安全漏洞的服务。 漏洞扫描的原理 一、信息收集 漏洞扫描器首先会收集目标系统的相关信息…

javacv和opencv对图文视频编辑-裸眼3D图片制作

通过斗鸡眼&#xff0c;将左右两张相似的图片叠加到一起看&#xff0c;就会有3D效果。 3D图片&#xff0c;3D眼镜&#xff0c;3D视频等原理类似&#xff0c;都是通过两眼视觉差引起脑补产生3D效果。 图片&#xff1a; 图片来源&#xff1a; 一些我拍摄的真*裸眼3D照片 - 哔哩…

1114: 逆序(数组)

题目描述 输入n&#xff08;1<n<10&#xff09;和n个整数&#xff0c;逆序输出这n个整数。 输入 输入n&#xff08;1<n<10&#xff09;&#xff0c;然后输入n个整数。 输出 逆序输出这n个整数&#xff0c;每个整数占4列&#xff0c;右对齐。 样例输入 6 4 5…

Leetcode:128. 最长连续序列

128. 最长连续序列 乍一看感觉很简单&#xff0c;一看要用O(n)??? 因为我觉得题目很难而且题目看起来很简单&#xff0c;感觉以后会用到&#x1f606;&#xff0c;做个记录 1.朴素做法 思路 答:任何一段连续的数都有一个左端点&#xff1a;比如&#xff08;1&#xff0c;…

Android车载系统Car模块架构链路分析

一、模块主要成员 CarServiceHelperService SystemServer 中专门为 AAOS 设立的系统服务&#xff0c;用来管理车机的核心服务 CarService。该系统服务的具体实现在 CarServiceHelperServiceUpdatableImpl CarService Car模块核心服务APP&#xff0c;Android 13版本开始分为…

Qt纯代码实现UI界面

1.相关信息 设置编辑框内容的字体样式&#xff0c;包括加粗、下划线、斜体、蓝色、红色、黑色 2.界面展示 3.相关代码 #include "dialog.h" #include <QHBoxLayout> #include <QVBoxLayout> #include <QCheckBox> #include <QRadioButton> …

commvault学习(5):在linux上安装cv客户端

我的环境&#xff1a; 服务器&#xff08;同时装有CS、MA&#xff09;&#xff1a;windows server2008r2 客户端&#xff1a;两台centos7 1.为两台centos7配置静态ip 使得2者可以与服务器ping通 2.在两台centos7上预留出足够大的磁盘空间以存放安装文件 我是在/mnt下创建了…

软件测试|使用matplotlib绘制箱型图

简介 绘制箱型图&#xff08;Box Plot&#xff09;是一种常用于可视化数据分布的方法&#xff0c;它可以显示数据的中位数、四分位数、异常值等统计信息。Matplotlib 是一个强大的 Python 数据可视化库&#xff0c;可以轻松绘制箱型图。在本文中&#xff0c;我们将介绍如何使用…

推荐五款超好用的AI写作自动生成器给你

随着人工智能技术的不断发展&#xff0c;AI写作自动生成器成为了现代写作的新宠。这些智能工具能够帮助我们快速生成高质量的文章&#xff0c;节省时间和精力。在本文中&#xff0c;我将向大家推荐五款超好用的AI写作自动生成器&#xff0c;希望能够为你的写作工作带来便利和效…

服务器数据恢复—OceanStor存储raid5热备盘同步数据失败的数据恢复案例

服务器数据恢复环境&#xff1a; 华为OceanStor某型号存储&#xff0c;存储内有一组由24块硬盘组建的raid5阵列&#xff0c;配置1块热备盘。 服务器故障&#xff1a; 该存储raid5阵列中有一块硬盘离线&#xff0c;热备盘自动激活并开始同步数据&#xff0c;在热备盘同步数据的…

Docker(一)简介和基本概念

一、简介 本章将带领你进入 Docker 的世界。 什么是 Docker&#xff1f; 用它会带来什么样的好处&#xff1f; 好吧&#xff0c;让我们带着问题开始这神奇之旅。 1.什么是 Docker Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目&…

【文档数据库】ES和MongoDB的对比

目录 1.由文档存储牵出的问题 2.什么是MongoDB&#xff1f; 3.ES和MongoDB的对比 1.由文档存储牵出的问题 本文或者说关于mongodb的这个系列文章的源头&#xff1a; 前面我们聊过了分布式链路追踪系统&#xff0c;在基于日志实现的分布式链路追踪的方式seluthzipkin中为了…

mysql常见的需求,对于关键字的使用

如何使用MySQL将列数据转化为逗号分隔的形式。我们可以使用内置函数GROUP_CONCAT()来实现这个功能 如何使用MySQL将列数据转化为逗号分隔的形式。我们可以使用内置函数GROUP_CONCAT()来实现这个功能&#xff0c;也可以根据实际需求自定义一个函数。这种技术在一些需要对数据进…

Qlib+backtrader:2014.1.1-2023.9.20最新回测结果,可以实盘吗?

今年以来&#xff0c;在研究了qlib和backtrader的基础上&#xff0c;把二者结合起来进行了一个策略研究。简单说就是用qlib在200只股票的股票池中进行滚动训练与预测&#xff08;walk forward&#xff09;&#xff0c;总体数据范围是2005到2023年&#xff0c;以20日间隔滚动训练…

寒假冬令营(算法编程)

1月18日&#xff08;二分&#xff09; 题目描述&#xff08;一&#xff09; 278. 第一个错误的版本 你是产品经理&#xff0c;目前正在带领一个团队开发新的产品。不幸的是&#xff0c;你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的&#xff0…

OpenGL:关于纹理映射时任意四边形中的插值问题(二)

OpenGL&#xff1a;关于纹理映射时任意四边形中的插值问题-CSDN博客 上次是使用逆双线性插值的方法解决四边形纹理映射时产生的折痕问题。 其实也有点问题&#xff0c;就是双线性插值会使得纹理产生一点扭曲。 不是投影的效果。 想达到纹理投影的效果&#xff0c;可以使用透…

CentOS查看修改时间

经常玩docker的朋友应该都知道&#xff0c;有很多的镜像运行起来后&#xff0c;发现容器里的系统时间不对&#xff0c;一般是晚被北京时间8个小时&#xff08;不一定&#xff09;。 这里合理怀疑是镜像给的初始时区是世界标准时间&#xff08;也叫协调世界时间&#xff09;。 有…

C++ 之LeetCode刷题记录(十二)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅。 依旧是追求耗时0s的一天。 69. x 的平方根 示例 1&#xff1a; 输入&#xff1a;x 4 输出&#xff1a;2 示例 2&#xff1a; 输入&#x…

品牌全球化:关于跨界合作的探索与解析

在全球化的时代背景下&#xff0c;品牌出海已经成为企业发展的重要战略之一。然而&#xff0c;面对文化差异、市场竞争和消费者需求等多重挑战&#xff0c;品牌如何成功地打入海外市场&#xff0c;是许多企业面临的难题。跨界合作作为一种新兴的商业模式&#xff0c;正逐渐成为…