题目大意

给定一个$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. iOS 线程管理的学习记录

    本文转载至 http://www.2cto.com/kf/201312/265451.html 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2 ...

  2. POJ1942

    Paths on a Grid Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 24236   Accepted: 6006 ...

  3. eclipse里面用svn关联项目

    eclipse里面共享项目经常会用到svn或者git插件 关联项目的步骤如下: 如果 点击finish会遇到卡住问题的话,不要着急,我们需要设置svn的client设置: 如果设置了之后还是很卡的话, ...

  4. redis持久化AOF详细操作步骤

    1.切换到redis目录下面,创建文件 s3-redis.conf 2.编辑文件s3-redis.conf 3.终止当前redis服务端 4.登录redis客户端失败,说明服务端已停止 5.重启red ...

  5. Linux里的发消息

    1.给指定用户发送消息 语法: write 用户名 说明: 1.用户是在线的 2.执行过程 a.敲完命令按回车,进入写信模式 b.写信的时候如果写错了Ctrl+退格 删除字符 c.写完以后Ctrl+D ...

  6. centos 下安装pdo_pgsql 只需一个命令_______yum install php56w-pgsql

    [root@localhost ~]# yum install php56w-pgsql Loaded plugins: fastestmirror, langpacks Repository pgd ...

  7. django 异步任务实现及Celery beat实现定时/轮询任务

    Celery定时任务 requirements celery==3.1.25 异步任务 django-celery==3.2.2 定时任务管理包 redis==2.10.6 django-redis- ...

  8. requests ip代理池单ip和多ip设置方式

    reqeusts库,在使用ip代理时,单ip代理和多ip代理的写法不同 (目前测试通过,如有错误,请评论指正) 单ip代理模式 省去headers等 import requests proxy = { ...

  9. LeetCode:救生艇【881】

    LeetCode:救生艇[881] 题目描述 第 i 个人的体重为 people[i],每艘船可以承载的最大重量为 limit. 每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit. ...

  10. Yii2学习笔记---内附GridView配置总结

    1./vendor/yiisoft/yii2/web/UrlManager.php 方法createUrl 修改url参数转码2.config/web.php 配置文件Yii::$app(应用主体)的 ...