题目大意

给定一个$3\times N$的方阵,每个位置的数恰好是每一个$[1,3\times N]$中的数。

初始时,每个位置$[x,y]$填的是$3(y-1)+x,(1\leq x\leq N,1\leq y\leq 3)$

例如$N=5$时如下图

现在给定一个尺寸完全相同的方阵,可以进行任意次此操作:

选择方阵中一个$3\times 3$的方阵,将这个方阵绕着中心点旋转$180°$

问是否有一种合法操作,使得初始状态成为给定的方阵。

题解:

考虑构造

首先我们可以排除任意$3x+1,3x+2,3x+3$没有按照顺序排在一列的情况,

随后对于每一列,有意义的只有它初始状态的位置和其上下的方向。

再考上并没有一次看透题目,凭借平时拧模仿的经验,可以先转转试试看。

既然想完成高端操作,就要从复杂的转法入手。

用字母表示每一列的位置,大写表示从上到下降序,小写表示从上到下升序。

有$a\space b\space c\space d\rightarrow C\space B\space A\space d\rightarrow C\space D\space a\space b\rightarrow A\space d\space c\space b\rightarrow A\space B\space C\space D$

即,对于任意连续四列,我们可以将每一列方向取反,且位置不变。

另有$a\space b\space c\space d\space e\rightarrow C\space B\space A\space d\space e\space \rightarrow C\space B\space E\space D\space a\rightarrow e\space b\space c\space D\space a\rightarrow e\space b\space A\space d\space C\rightarrow a\space B\space E\space d\space C\rightarrow a\space B\space c\space D\space e$

即,对于任意连续五列,我们可以将第二、四列取反同时保持顺序不变。

两者综合一下,就可以转化为对于连续五个,我们可以将其中两个相隔$1$列的列的方向取反,其余顺序不变。

现在我们只需要解决如何快速简洁地将每一列转回原来的位置上即可。

按每列地初始位置从小到大地顺序考虑,将每一列从右向左转回原来的位置:

假设有$xbcdefgha$,我们欲将$a$转回$x$,若要移动的距离不是$2$的倍数,则无解。

否则 ,我们希望改动最小,先不可避免地将$a$转到$x$的位置,就有$aBXDCFEHG$,但是我们发现这样改动的太多了,但不难发现,只要把$X$再转回$a$原来的位置,就可以得到$aBcdefghx$,这样,一共就交换了$a$,$x$的位置,同时改变了$x$右一列的方向。

特别的,如果$a$,$x$距离列数是$2$的倍数但不是$4$的倍数,则涉及$a$和$x$的操作有奇数次,$a$和$x$均要变向。

所以,我们首先要把每一列转到它所在的位置,然后在$n\leq 4$时特判,其余情况从小到大枚举位置$i$,如果第$i$列不是从上到下升序,就将第$i$和第$i+2$列变向,若第$n-1$和第$n$位最终至少有一位不满足从上到下升序,则无解,否则我们已经构造出了合法可行解。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define M 500020
using namespace std;
int read(){
int nm=0,fh=1;char cw=getchar();
for(;!isdigit(cw);cw=getchar()) if(cw=='-') fh=-fh;
for(;isdigit(cw);cw=getchar()) nm=nm*10+(cw-'0');
return nm*fh;
}
int n,m,t[3][M],p[M],cnt,pos[M];
void fail(){puts("No");exit(0);}
void ROW(int x,int y,int z){
if(x>z) swap(x,z);
if(y!=x+1||y!=z-1) return fail();
if(y%3!=2) return fail();
}
int main(){
n=read();
for(int j=0;j<3;j++){
for(int i=1;i<=n;i++) t[j][i]=read();
}
for(int i=1;i<=n;i++){
ROW(t[0][i],t[1][i],t[2][i]);
p[i]=(t[1][i]+1)/3;
if(t[0][i]>t[2][i]) p[i]=-p[i];
if(abs(abs(p[i])-i)&1) fail();
pos[abs(p[i])]=i;
}
for(int i=1;i<=n;i++){
if(pos[i]==i) continue;
p[i+1]=-p[i+1],swap(p[i],p[pos[i]]);
if((abs(i-pos[i])>>1)&1) p[i]=-p[i],p[pos[i]]=-p[pos[i]];
pos[abs(p[pos[i]])]=pos[i],pos[i]=i;
}
for(int i=1;i<=n;i++) if(p[i]<0) cnt++;
if(cnt&1) fail();
if(n<=3&&cnt>0) fail();
if(n==4&&cnt%4>0) fail();
for(int i=1;i<n-1;i++) if(p[i]<0) p[i]=-p[i],p[i+2]=-p[i+2];
if(p[n-1]<0||p[n]<0) fail();
puts("Yes");
return 0;
}

  

Agc_006 E Rotate 3x3的更多相关文章

  1. 2017国家集训队作业[agc006e]Rotate 3x3

    2017国家集训队作业[agc006e]Rotate 3x3 题意: ​ 给你一个\(3*N\)的网格,每次操作选择一个\(3*3\)的网格,旋转\(180^\circ\).问可不可以使每个位置\(( ...

  2. [AGC006E] Rotate 3x3 树状数组+贪心

    Description ​ XFZ在北京一环内有一套房. ​ XFZ房子的地砖呈网格状分布,是一个3∗N3∗N的网格.XFZ在买下这套房时,每个地砖上有一个数字,位置为(i,j)(i,j)的地砖上的数 ...

  3. 【做题】agc006e - Rotate 3x3——分析&思维

    原文链接 https://www.cnblogs.com/cly-none/p/9800105.html 题意:给出一个三行\(n\)列的矩阵.问它能否由满足\(a_{ij} = 3(j-1) + i ...

  4. 【AGC006E】 Rotate 3x3

    Description ​ 题目链接 Solution ​ 显然每一列只能一起动,乱动则无解. ​ 对原网格按列黑白染色,显然每一列数只能在相同颜色之间交换,乱动则无解. ​ 之后考虑构造方案. ​ ...

  5. [agc006E]Rotate 3x3

    Description 给你一个3*N的网格,位置为(i,j)的网格上的数为i+3(j-1).每次选一个3*3的网格旋转180度,问最后能否使得网格(i,j)的值为ai,j.(5≤N≤105) 如图: ...

  6. AT2166 Rotate 3x3

    传送门 这个题网上有两种做法,一种是树状数组的,还有一种是暴力模拟的,暴力模拟显然不够优美,所以我用的树状数组 显然可以从初状态推到目标状态,我们也可以考虑倒推回去 首先可以容易发现每列的数字是不变的 ...

  7. AtCoder Grand Contest 006

    AtCoder Grand Contest 006 吐槽 这套题要改个名字,叫神仙结论题大赛 A - Prefix and Suffix 翻译 给定两个串,求满足前缀是\(S\),后缀是\(T\),并 ...

  8. RE:从零开始的AGC被虐(到)生活(不能自理)

    RE:从零开始的AGC被虐(到)生活(不能自理) 「一直注视着你,似近似远,总是触碰不到.」 --来自风平浪静的明天 AtCoder Grand Contest 001 B: Mysterious L ...

  9. AtCoder Grand Contest

    一句话题解 QwQ主要是因为这篇文章写的有点长……有时候要找某一个题可能不是很好找,所以写了这个东西. 具体的题意.题解和代码可以再往下翻._(:з」∠)_ AGC 001 C:枚举中点/中边. D: ...

随机推荐

  1. urllib库利用cookie实现模拟登录慕课网

    思路 1.首先在网页中使用账户和密码名登录慕课网 2.其次再分析请求头,如下图所示,获取到请求URL,并提取出cookie信息,保存到本地 3.最后在代码中构造请求头,使用urllib.request ...

  2. 1065. [Nescafe19] 绿豆蛙的归宿(概率)

    1065. [Nescafe19] 绿豆蛙的归宿 ★   输入文件:ldfrog.in   输出文件:ldfrog.out   简单对比时间限制:1 s   内存限制:128 MB [背景] 随着新版 ...

  3. C# RangeHelper

    /// <summary> /// Range Helper /// </summary> /// <typeparam name="T">&l ...

  4. python字符串基本方法

    字符串类型在Python中是十分重要的类型,他一般用引号中间添加字符的形式表达,不同于其他语言的是,Python中双引号(” “)与单引号(’ ‘)是不予区分的.都可以用来表示字符串 创建.赋值和访问 ...

  5. 【python】-- RabbitMQ RPC模型

    RabbitMQ RPC模型 RPC(remote procedure call)模型说通俗一点就是客户端发一个请求给远程服务端,让它去执行,然后服务端端再把执行的结果再返回给客户端. 1.服务端 i ...

  6. ShowModal 代码分析

    下面为Delphi中,方法TCustomForm.ShowModal的代码,通过分析以下代码,可以了解ShowModal到底是怎么一回事! 1 2 3 4 5 6 7 8 9 10 11 12 13 ...

  7. POJ3094 Sky Code(莫比乌斯反演)

    POJ3094 Sky Code(莫比乌斯反演) Sky Code 题意 给你\(n\le 10^5\)个数,这些数\(\le 10^5\),问这些这些数组成的互不相同的无序四元组(a,b,c,d)使 ...

  8. spring AOP理解和相关术语

    一.AOP理解 AOP:横向抽取机制,底层使用代理方式实现. 示例: 现有LogDAO接口以及实现Log接口的Log类.类有add的方法,现在要打印add方法的开始时间和结束时间.(即增强Log的ad ...

  9. QT5的QDesktopSerivices不同

    QT4使用QDesktopServices::storageLocation(QDesktopServices::xxxx)来获取一些系统目录, 现在则要改成QStandardPaths::writa ...

  10. php添加或升级扩展模块步骤

    php添加或升级扩展模块步骤: 1).下载对应扩展的稳定版源码包2).进入到解压后的源码包执行: sudo /usr/local/php/bin/phpize //对应安装到哪个php版本 sudo ...