题目大意

给定一个$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. os模块,sys模块

    # os模块 # os模块是与操作系统交互的一个接口 ''' 和工作目录相关: os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径(在什么地方执行就是那个文件的路径) os ...

  2. 解决不同浏览器创建不同 XMLHTTP 对象的问题

    function GetXmlHttpObject() { var xmlHttp=null; try { // Firefox, Opera 8.0+, Safari xmlHttp=new XML ...

  3. c/c++的一些小知识点2

  4. 序列DP(输出有要求)

    DP Time Limit:10000MS     Memory Limit:165888KB     64bit IO Format:%lld & %llu Submit Status De ...

  5. EasyNVR无插件直播服务器软件使用详情功能 - 录像功能说明

    背景介绍 EasyNVR不仅仅拥有无插件的直播功能,更拥有对于直播录像的存储和日期检索功能: 本篇博文主要用于介绍EasyNVR的录像功能. 之前有博文介绍相关的录像功能,本篇主要为了介绍录像的新功能 ...

  6. 记录-阿里云Oss文件上传

    public class OssUtil { /** * 上传图片 * @param file * @param request * @return */ public static Map<S ...

  7. spring mvc中的@PathVariable

    spring mvc中的@PathVariable是用来获得请求url中的动态参数的,十分方便,复习下: @Controller public class TestController { @Requ ...

  8. A vectorized example

    http://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture4.pdf

  9. flex (html弹性布局)

    flex是什么? 任何容器都可以指定为flex布局: .box{ display: flex;  /* 行内元素可以使用:inline-flex,webket内核浏览器必须 -webkit-flex ...

  10. 3.写一个hello world页面

    经过1和2的学习,现在已经可以正常启动Django了,这一节说怎么写一个hello world页面,所有的环境基础就是1和2中搭建的 1.在app模块中添加页面 具体为 hello_django\he ...