题目大意

给定一个$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. JQuery基础知识--方便忘记时查看

    第一次写博客,不多说废话,实用为先.如有不对,请多指正. JQuery api 第一步引入JQuery库. <script type="text/javascript" sr ...

  2. hihoCoder#1037 : 数字三角形(DP)

    [题目链接]:click here~~ 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 问题描写叙述 小Hi和小Ho在经历了螃蟹先生的任务之后被奖励了一次出国旅游的机会,于是他 ...

  3. lua(简单的传参)

    #include <iostream> #include <string.h> extern "C" { /*头文件lua.h定义了Lua提供的基础函数,包 ...

  4. DP(正解完全背包+容斥)

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

  5. 九度OJ 1199:找位置 (计数)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2083 解决:1010 题目描述: 对给定的一个字符串,找出有重复的字符,并给出其位置,如:abcaaAB12ab12 输出:a,1:a,4 ...

  6. python脚本分析nginx访问日志

    日志格式如下: 223.74.135.248 [11/May/2017:11:19:47 +0800] "POST /login/getValidateCode HTTP/1.1" ...

  7. iPhone快速获取UUID

    1.一张图解决不懂iPhone手机的小白获取UDID的方式

  8. vue前戏ES6

    es6语法 es6语法:let和const: { var a=123; let b=234; } console.log(a); console.log(b); 浏览器里会只看到123; 而且还会抱一 ...

  9. [ACM] FZU 2087 统计数边 (有多少边至少存在一个最小生成树里面)

    Problem Description 在图论中,树:随意两个顶点间有且仅仅有一条路径的图. 生成树:包括了图中全部顶点的一种树. 最小生成树:对于连通的带权图(连通网)G,其生成树也是带权的. 生成 ...

  10. table control里面各种属性和事件

    [转自]http://blog.csdn.net/hackai886/article/details/7935366 SAP中,Table Control是在Screen中用的最广泛的控件之一了,可以 ...