2017国家集训队作业[agc006e]Rotate 3x3
2017国家集训队作业[agc006e]Rotate 3x3
题意:
给你一个\(3*N\)的网格,每次操作选择一个\(3*3\)的网格,旋转\(180^\circ\)。问可不可以使每个位置\((i,j)\)的数为\(i+3*(j-1)\)。(\(n\leq10^5\))
题解:
因为在操作中,一列的\(3\)个数不可能被打乱,可以预处理判断。我们思考旋转一次造成的影响有什么?记\(f(0/1)、g(0/1)\)分别是一开始奇数位\(/\)偶数位的反列和恢复到原始状态的步数模\(2\)的值。我们可以发现,假设一某个奇数位位中心,进行一次旋转,\(f(1)\)的奇偶性没有变化,而\(f(0)\)的奇偶性改变了。
又因为我们可以构造出(约定\(a\)表示正着的序列\(A\)表示反着的序列):
&a& &b& &c& &d& &e&\\
&C& &B& &A& &d& &e&\\
&C& &B& &E& &D& &a&\\
&e& &b& &c& &D& &a&\\
&e& &b& &A& &d& &C&\\
&a& &B& &E& &d& &C&\\
&a& &B& &c& &D& &e&(1)\\
&a& &d& &C& &b& &e&\\
&c& &D& &A& &b& &e&\\
&c& &B& &a& &d& &e&\\
&A& &b& &C& &d& &e&(2)\\
\end{align*}
\]
构造使得我们可以将任意两个相距为二的数列交换,证明了只要移动后的网格的\(f(0)、f(1)\)奇偶性都为偶的话,存在合法方案。即有\(f(0)=g(1)、f(1)=g(0)\)时存在合法方案。步数什么的树状数组求求逆序对就可以啦。最后才想出来,我真是太弱了= =!。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define fo(i,l,r) for(int i=l;i<=r;i++)
#define of(i,l,r) for(int i=l;i>=r;i--)
using namespace std;
typedef long long ll;
inline int rd()
{
static int x,f;
x=0,f=1;
char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
}
const int N=100010;
int n,a[4][N],v[4],f[2],g[2];
int pos[N];
inline bool cmp(int a,int b,int c){return a+1==b&&b+1==c&&c%3==0;}
inline int fabs(int a){return a<0?-a:a;}
namespace TA{
int tr[N<<2];
#define lowbit(x) (x&-x)
inline void insert(int x,int d){for(;x;x-=lowbit(x))tr[x]+=d;}
inline int query(int x){int res=0;for(;x<=n;x+=lowbit(x))res+=tr[x];return res;}
inline void clear(){fo(i,0,n)tr[i]=0;}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
n=rd();
fo(i,0,2)fo(j,1,n)a[i][j]=rd();
fo(i,1,n){
if(!cmp(a[0][i],a[1][i],a[2][i])&&!cmp(a[2][i],a[1][i],a[0][i])){puts("No");return 0;}
int t=a[2][i]>a[0][i]?a[2][i]/3:a[0][i]/3;
if((i-t)&1){puts("No");return 0;}pos[t]=i;
if(a[0][i]>a[2][i])f[i%2]^=1;
}
int sum=0;
for(int i=1;i<=n;i+=2){
int now=pos[i]+(TA::query(pos[i])<<1);
TA::insert(pos[i],1);
// cout<<i<<' '<<now<<endl;
if((fabs(i-now)/2)&1)g[i%2]^=1;
sum+=fabs(i-now)/2;
}
// cout<<sum<<endl;
TA::clear();sum=0;
for(int i=2;i<=n;i+=2){
int now=pos[i]+(TA::query(pos[i])<<1);
TA::insert(pos[i],1);
// cout<<i<<' '<<now<<endl;
if((fabs(i-now)/2)&1)g[i%2]^=1;
sum+=fabs(i-now)/2;
}
// cout<<sum<<endl;
// cout<<f[0]<<' '<<f[1]<<endl;
// cout<<g[0]<<' '<<g[1]<<endl;
if(f[0]==g[1]&&f[1]==g[0])puts("Yes");
else puts("No");
return 0;
}
2017国家集训队作业[agc006e]Rotate 3x3的更多相关文章
- 2017国家集训队作业Atcoder题目试做
2017国家集训队作业Atcoder题目试做 虽然远没有达到这个水平,但是据说Atcoder思维难度大,代码难度小,适合我这种不会打字的选手,所以试着做一做 不知道能做几题啊 在完全自己做出来的题前面 ...
- 2017国家集训队作业[agc016b]Color Hats
2017国家集训队作业[agc016b]Color Hats 题意: 有\(N\)个人,每个人有一顶帽子.帽子有不同的颜色.现在,每个人都告诉你,他看到的所有其它人的帽子共有多少种颜色,问有没有符合所 ...
- 2017国家集训队作业[agc016e]Poor Turkey
2017国家集训队作业[agc016e]Poor Turkey 题意: 一开始有\(N\)只鸡是活着的,有\(M\)个时刻,每个时刻有两个数\(X_i,Y_i\),表示在第\(i\)个时刻在\(X_i ...
- 2017国家集训队作业[agc006f]Blackout
2017国家集训队作业[agc006f]Blackout 题意: 有一个\(N*N\)的网格,一开始有\(M\)个格子被涂黑,给出这\(M\)个格子,和染色操作:如果有坐标为\((x,y),(y,z) ...
- 2017国家集训队作业[agc004f]Namori
2017国家集训队作业[agc004f]Namori 题意: 给你一颗树或环套树,树上有\(N\)个点,有\(M\)条边.一开始,树上的点都是白色,一次操作可以选择一条端点颜色相同的边,使它的端点颜色 ...
- 2017国家集训队作业[arc082d]Sandglass
2017国家集训队作业[arc082d]Sandglass 题意: 有一个沙漏,初始时\(A\)瓶在上方,两个瓶子的最大容量都为\(X\)克,沙子流动的速度为\(1g\)每单位时间.给出\(K\) ...
- 2017国家集训队作业[arc076d/f][Exhausted?]
2017国家集训队作业[arc076d/f][Exhausted?] 题意: 有\(N\)个人,\(M\)把椅子,给出\(...L_i.R_i\)表示第\(i\)个人可以选择编号为\(1\sim ...
- 2017国家集训队作业[agc014d]Black and White Tree
2017国家集训队作业[agc014d]Black and White Tree 题意: 有一颗n个点的树,刚开始每个点都没有颜色.Alice和Bob会轮流对这棵树的一个点涂色,Alice涂白,B ...
- 2017国家集训队作业[agc008f]Black Radius
2017国家集训队作业[agc008f]Black Radius 时隔4个月,经历了省赛打酱油和中考各种被吊打后,我终于回想起了我博客园的密码= = 题意: 给你一棵树,树上有若干个关键点.选中某 ...
随机推荐
- 51Nod 蜥蜴和地下室(搜索)
哈利喜欢玩角色扮演的电脑游戏<蜥蜴和地下室>.此时,他正在扮演一个魔术师.在最后一关,他必须和一排的弓箭手战斗.他唯一能消灭他们的办法是一个火球咒语.如果哈利用他的火球咒语攻击第i个弓箭手 ...
- orac
#!/bin/bash # Copyright (c) 2013, 2016, Liang Guojun. All rights reserved. # Program: # Check ...
- tensorboard 使用
TensorBoard是TensorFlow 的可视化工具.主要为了更方便用户理解 TensorFlow 程序.调试与优化,用户可以用 TensorBoard 来展现 TensorFlow 图像,绘制 ...
- Git 内部原理 - (7)维护与数据恢复 (8) 环境变量 (9)总结
维护与数据恢复 有的时候,你需要对仓库进行清理 - 使它的结构变得更紧凑,或是对导入的仓库进行清理,或是恢复丢失的内容. 这个小节将会介绍这些情况中的一部分. 维护 Git 会不定时地自动运行一个叫做 ...
- 欢迎访问微先锋vXianFeng官方博客
欢迎访问微先锋vXianFeng官方博客,专注微商城.P2P理财.山寨矿机平台研究与开发!
- 记intel杯比赛中各种bug与debug【其二】:intel caffe的使用和大坑
放弃使用pytorch,学习caffe 本文仅记录个人观点,不免存在许多错误 Caffe 学习 caffe模型生成需要如下步骤 编写network.prototxt 编写solver.prototxt ...
- 前端之CSS介绍
CSS介绍 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素. 当浏览器读到一个样式表,它就会按照这个样式表来对文档进行格式化(渲染). CSS的语法 CSS语 ...
- php后端控制可跨域的域名,允许图片跨域上传
跨域问题经常需要面对,前端需要做的比较直接要么选择ajax异步提交,XML或者jsonp,要么表单提交前端常见跨域解决方案 jsonp基本可以搞定大部分跨域问题,但问题也比较明显,只能通过get方式提 ...
- 紫书 习题 10-9 UVa 294(正约数个数)
一个数的正约数个数等于这个数的质因数分解后 每一项幂+1的积 因为每个质因数的幂可以为0, 1, 2--(注意可以为0) 所以就每个质因数配一个幂任意组合就可得一个正因数,根据乘法原理可得正约数个数. ...
- 使用maven安装jar到本地仓库
mvn install:install-file "-DgroupId={安装的jar包的groupid,可以随意起名}" "-DartifactId={安装jar包的I ...