AT2166 Rotate 3x3
title
简化题意
我们有一个 \(3\) 行 \(N\) 列的初始矩阵,\((i,j)\) 位置的数为 \(i+3j-3\)。
我们有一个这样的操作:选择一个 \(3\times 3\) 的子矩阵,将这个子矩阵旋转 \(180°\)。(具体见下面的图)。
现在给出一个 \(3\) 行 \(N\) 列的矩阵(矩阵中的数各不相同),问能否通过若干次上述操作将初始矩阵变为给定的矩阵。
analysis
很锻炼思维的一道题目啊。
思维不难(啊?)
我们首先要把存在一列不合法情况的现有矩阵直接判掉。
然后下面是好玩的地方:我们用 \(to[i]\) 表示第 \(i\) 列原本在矩阵中的位置。
然后我们发现,如果 \(to[i]\) 和 \(i\) 不是同为奇数或偶数,那就不合法,直接判掉。
下面,来介绍一个奇妙的东西:我们可以将隔着一列的两列同时颠倒!方法如下:
我们把每一列当做一个字母,设小写字母颠倒之后是大写字母, 于是我们设 \(abcde\) 为原矩阵的一部分 ,然后就到了我们构造的时候啦!
\[
\underline{abc}de\to CB\underline{Ade}\to \underline{CBE}Da\to eb\underline{cDa}\to \underline{ebA}dC\to aB\underline{EdC}\to aBcDe
\]
这样我们就构造出了一种方案使得这部分的第二列和第四列颠倒了。
那第一列和第三列呢?
基于上面的方案,我们有:
\[
a\underline{BcD}e\to\underline{adC}be\to\underline{DAb}e\to\underline{cBa}de\to AbCde
\]
大功告成!
第三列和第五列同理啦 !
所以如果这个矩阵的每一列都已经排好了,那剩下的就直接看看如果奇数列或偶数列共有奇数个列是颠倒的话,那就是输出 \(No\) 就好了。(因为只需要判奇偶,所以下面写的都是 异或1 。 )
我们会发现如果我们要交换两个奇数列,我们只需要将偶数列的颠倒数 异或1 就好了,偶数列反之。
于是我们枚举\(1\sim n\),然后将 \(i\) 和 \(to[i]\) 交换,直到 \(i==to[i]\) 为止。
code
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
char buf[1<<15],*fs,*ft;
inline char getc() { return (ft==fs&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),ft==fs))?0:*fs++; }
template<typename T>inline void read(T &x)
{
x=0;
T f=1, ch=getchar();
while (!isdigit(ch) && ch^'-') ch=getchar();
if (ch=='-') f=-1, ch=getchar();
while (isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48), ch=getchar();
x*=f;
}
int t[2],to[maxn],a[4][maxn];
int main()
{
int n;read(n);
for (int i=1; i<=3; ++i)
for (int j=1; j<=n; ++j) read(a[i][j]);
for (int i=1; i<=n; ++i)
{
to[i]=a[2][i]/3+1;
if (!((a[1][i]-a[2][i]==-1 && a[2][i]-a[3][i]==-1 && a[1][i]%3==1) || (a[1][i]-a[2][i]==1 && a[2][i]-a[3][i]==1 && !(a[1][i]%3))) || (abs(i-to[i])&1))
{
puts("No"); exit(0);
}
t[i&1]^=(a[1][i]>a[2][i]);
}
for (int i=1; i<=n; ++i)
while (to[i]^i)
{
t[i&1^1]^=1;
swap(to[i],to[to[i]]);
}
puts(t[0] || t[1] ? "No" : "Yes");
return 0;
}
原文地址:https://www.cnblogs.com/G-hsm/p/11348422.html
- spring整合quartz
- android沉浸式状态栏的实现
- Jayrock: JSON and JSON-RPC for .NET
- rabbitMQ教程(三) spring整合rabbitMQ代码实例
- 谈谈序列化—实体bean一定要实现Serializable接口?
- Kafka源码系列之通过源码分析Producer性能瓶颈
- 微软在动态语言支持上超越了Java?
- JAVA图片批量上传JS-带预览功能
- Netty-Websocket 根据URL路由,分发机制的实现
- DrawerLayout实现网易新闻抽屉效果
- shiro权限控制(一):shiro介绍以及整合SSM框架
- websocket(三) 进阶!netty框架实现websocket达到高并发
- Kafka源码系列之Broker的IO服务及业务处理
- Dubbo(五) Dubbo入门demo——helloworld
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- RabbitMQ 最常用的 3 大模式!
- 啥?HashMap 1.8 还有死循环?你逗我呢!
- 他写的东西,你们喜欢么?
- 告诉你一个 AtomicInteger 的惊天大秘密!
- 001--算法之"高手过招"[分治算法专题]
- 快速入门使用tikz绘制深度学习网络图
- 后端服务慢成狗?试试这 7 招!
- 高性能无锁并发框架 Disruptor,太强了!
- Spring Boot 太狠了,一口气发布了 3 个版本!
- 贷款违约预测-Task2 数据分析
- Redis 最牛实践:业务层面和运维层面优化!
- 一个 randomkey 命令导致的 Redis 事故。。
- 分布式锁(数据库、Redis、ZK)拍了拍你
- 贷款违约预测-Task3 特征工程
- 用SQL代替DSL查询ElasticSearch怎样?