Agc_006 E Rotate 3x3
题目大意
给定一个$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的更多相关文章
- 2017国家集训队作业[agc006e]Rotate 3x3
2017国家集训队作业[agc006e]Rotate 3x3 题意: 给你一个\(3*N\)的网格,每次操作选择一个\(3*3\)的网格,旋转\(180^\circ\).问可不可以使每个位置\(( ...
- [AGC006E] Rotate 3x3 树状数组+贪心
Description XFZ在北京一环内有一套房. XFZ房子的地砖呈网格状分布,是一个3∗N3∗N的网格.XFZ在买下这套房时,每个地砖上有一个数字,位置为(i,j)(i,j)的地砖上的数 ...
- 【做题】agc006e - Rotate 3x3——分析&思维
原文链接 https://www.cnblogs.com/cly-none/p/9800105.html 题意:给出一个三行\(n\)列的矩阵.问它能否由满足\(a_{ij} = 3(j-1) + i ...
- 【AGC006E】 Rotate 3x3
Description 题目链接 Solution 显然每一列只能一起动,乱动则无解. 对原网格按列黑白染色,显然每一列数只能在相同颜色之间交换,乱动则无解. 之后考虑构造方案. ...
- [agc006E]Rotate 3x3
Description 给你一个3*N的网格,位置为(i,j)的网格上的数为i+3(j-1).每次选一个3*3的网格旋转180度,问最后能否使得网格(i,j)的值为ai,j.(5≤N≤105) 如图: ...
- AT2166 Rotate 3x3
传送门 这个题网上有两种做法,一种是树状数组的,还有一种是暴力模拟的,暴力模拟显然不够优美,所以我用的树状数组 显然可以从初状态推到目标状态,我们也可以考虑倒推回去 首先可以容易发现每列的数字是不变的 ...
- AtCoder Grand Contest 006
AtCoder Grand Contest 006 吐槽 这套题要改个名字,叫神仙结论题大赛 A - Prefix and Suffix 翻译 给定两个串,求满足前缀是\(S\),后缀是\(T\),并 ...
- RE:从零开始的AGC被虐(到)生活(不能自理)
RE:从零开始的AGC被虐(到)生活(不能自理) 「一直注视着你,似近似远,总是触碰不到.」 --来自风平浪静的明天 AtCoder Grand Contest 001 B: Mysterious L ...
- AtCoder Grand Contest
一句话题解 QwQ主要是因为这篇文章写的有点长……有时候要找某一个题可能不是很好找,所以写了这个东西. 具体的题意.题解和代码可以再往下翻._(:з」∠)_ AGC 001 C:枚举中点/中边. D: ...
随机推荐
- html5-框架网站
1.html5+:http://www.html5plus.org/ 2.hbuilder:http://www.dcloud.io/ 3.mui:http://dev.dcloud.net.cn/m ...
- win10中如何成功安装lxml
lxml官网地址:http://lxml.de/index.html 问题: 在学习lxm的时候,发现在win10下总是安装失败,如下: 在网上搜索了半天也没找到具体的解决方案,就FQgoogle下, ...
- django定时任务实现(言简意赅) Django折腾记之启动定时任务(转)
最近做一个小项目,用Django搭建的服务器,着实折腾了我一周的时间,这里一点一点记下来,以免忘记. 在这个项目中我需要用到一个每隔60s就去执行的一个函数的功能,而且需要在服务器启动时就要启动这个定 ...
- hdu3579(线性同余方程组)
Hello Kiki Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- phpstorm+xdebug, 实现断点调试: xdebug如何配置
[XDebug] xdebug.profiler_output_dir="D:\phpStudy\tmp\xdebug" xdebug.trace_output_dir=" ...
- l如何把SQLServer表数据导出CSV文件,并带列名
http://jingyan.baidu.com/article/4b07be3c466b5d48b280f37f.html 微信公众号:
- Docker学习总结之docker创建私有仓库(private Repositories)
Docker 创建 Private Repositories 前言 基于GFW的缘故,国内大陆基本无法pull国外的镜像,更别说官方的index了.如果images无法pull下来,那么docker就 ...
- Data Structure Binary Tree: Convert a given tree to its Sum Tree
http://www.geeksforgeeks.org/convert-a-given-tree-to-sum-tree/ #include <iostream> #include &l ...
- Maze迷宫问题(求最优解)
迷宫地形我们可以通过读文件的形式,通过已知入口逐个遍历坐标寻找通路. 文件如图: 每个坐标的位置用结构体来记录: struct Pos //位置坐标 { int _row; int _col; }; ...
- day3--集合、文件操作、字符编码与转换、函数(递归,lambda,filter,map)、字典排序
list1 = set([1, 2, 3, 4, 5, 6, 5, 5, 5])list2 = set([11, 2, 36, 'a', 5, 6, 5, 5, 5])list3 = set([1, ...