Description

​ XFZ在北京一环内有一套房。

​ XFZ房子的地砖呈网格状分布,是一个3∗N3∗N的网格。XFZ在买下这套房时,每个地砖上有一个数字,位置为(i,j)(i,j)的地砖上的数字恰好为i+3(j−1)i+3(j−1)。

N=5N=5时XFZ家的俯视图

​ XFZ的房子特别高级,地底暗藏转轴机关。每次转轴可以顶起一片3x3的地砖,将其旋转180°,再放下地砖。

一个转轴作业的例子(蓝色区域为旋转完成之后的区域)

​ XFZ决定要让地砖有美感。他希望他能使用他的高级转轴达到一个目的:对于位置为(i,j)(i,j)的地砖,其数字恰好为ai,jai,j。其中aa是一个XFZ指定的3∗N3∗N的目标数组。

Input

​ 第一行一个正整数NN(5≤N≤1055≤N≤105)

​ 接下来3行,每行NN列,描述ai,jai,j(1≤ai,j≤3N1≤ai,j≤3N)

​ 保证所有的ai,jai,j互不相同。

Output

​ 如果XFZ的目标能够实现,输出“Yes”,否则输出“No”。二者皆不包含引号。

Sample Input

#Sample Input 1
5
9 6 15 12 1
8 5 14 11 2
7 4 13 10 3 #Sample Input 2
5
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15 #Sample Input 3
5
1 4 7 10 13
2 5 8 11 14
3 6 9 12 15 #Sample Input 4
6
15 10 3 4 9 16
14 11 2 5 8 17
13 12 1 6 7 18 #Sample Input 5
7
21 12 1 16 13 6 7
20 11 2 17 14 5 8
19 10 3 18 15 4 9

Sample Output

#Sample Output 1
Yes #Sample Output 2
No #Sample Output 3
Yes #Sample Output 4
Yes #Sample Output 5
No

HINT

​ 第一组样例对应着题目描述中使用的例子。

​ 第三组样例不需要任何操作,直接满足要求

本题采用subtask。

存在10%10%的数据满足n≤8n≤8。

Sol

首先意识到奇偶列是独立的

然后我们发现这个东西:

• 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)

这说明我们可以凭空去翻转一种数的连续两列(奇数或者偶数),所以限制条件变成了偶数列翻转量和奇数列移动量、奇数列翻转量和奇数列移动量必须是同奇或者同偶才能实现,毕竟两种东西是捆绑的。。。而且上面的要求是偶数个奇偶,奇数是没有办法的。。。所以差必须是偶数才能得到同奇同偶。

做的时候先特判一些傻逼情况,判完之后分奇偶进行,用树状数组维护区间右移个数(类似冒泡排序的交换),然后每次\(O(logn)\)进行一次对某一列的复位并计算移动量(翻转量输入的时候就能判定)。

Code

#include <bits/stdc++.h>
using namespace std;
int n,a[3][100005],b[5],mov[2],rev[2],should[100005],now[100005],s[100005];
void upd(int x,int y){for(;x;x-=x&-x) s[x]+=y;}
int que(int x){int a=0;for(;x<=n;x+=x&-x) a+=s[x];return a;}
int main()
{
scanf("%d",&n);
for(int i=0;i<3;i++) for(int j=1;j<=n;j++) scanf("%d",&a[i][j]);
for(int i=1;i<=n;i++)
{
b[0]=a[0][i];b[1]=a[1][i];b[2]=a[2][i];sort(b,b+3);
if(b[2]%3||b[0]+1!=b[1]||b[1]+1!=b[2]||b[1]!=a[1][i]||(i-b[2]/3)%2) return puts("No"),0;
should[i]=b[2]/3;rev[i%2]=(rev[i%2]+(a[0][i]>a[2][i]))%2;now[should[i]]=i;
}
for(int i=1;i<=n;i++,i++)
{
int nex=now[i]+2*que(now[i]);
mov[1]=(mov[1]+abs(i-nex)/2)%2;upd(now[i],1);
}
memset(s,0,sizeof(s));
for(int i=2;i<=n;i++,i++)
{
int nex=now[i]+2*que(now[i]);
mov[0]=(mov[0]+abs(i-nex)/2)%2;upd(now[i],1);
}
if(mov[0]!=rev[1]||mov[1]!=rev[0]) puts("No");
else puts("Yes");
}

[AGC006E] Rotate 3x3 树状数组+贪心的更多相关文章

  1. 线段树+树状数组+贪心 HDOJ 5338 ZZX and Permutations

    题目传送门 /* 题意:不懂... 线段树+树状数组+贪心:贪心从第一位开始枚举,一个数可以是循环节的末尾或者在循环节中,循环节(循环节内部是后面的换到前面,最前面的换到最后面).线段树维护最大值,树 ...

  2. bzoj4240: 有趣的家庭菜园(树状数组+贪心思想)

    4240: 有趣的家庭菜园 题目:传送门 题解: 好题!%%% 一开始不知道在想什么鬼,感觉满足二分性?感觉可以维护一个先单调增再单调减的序列? 然后开始一顿瞎搞...一WA 看一波路牌...树状数组 ...

  3. Gym - 102082G What Goes Up Must Come Down (树状数组+贪心)

    题意:有一个长度为n的序列,你每次可以选择两个相邻的元素交换,求把这个序列排成单峰序列的最少交换次数. 方法一:将元素按数值从大到小排序(保存原来的位置),把最大的插在中间,剩下的依次往两边放,依次考 ...

  4. BZOJ 1106: [POI2007]立方体大作战tet 树状数组 + 贪心

    Description 一个叫做立方体大作战的游戏风靡整个Byteotia.这个游戏的规则是相当复杂的,所以我们只介绍他的简单规 则:给定玩家一个有2n个元素的栈,元素一个叠一个地放置.这些元素拥有n ...

  5. 【BZOJ4240】有趣的家庭菜园 树状数组+贪心

    [BZOJ4240]有趣的家庭菜园 Description 对家庭菜园有兴趣的JOI君每年在自家的田地中种植一种叫做IOI草的植物.JOI君的田地沿东西方向被划分为N个区域,由西到东标号为1~N.IO ...

  6. bzoj 4240: 有趣的家庭菜园【树状数组+贪心】

    以为是逆序对数-- 实际上,原数组移动若干次后我们会得到一个新的下标序列,需要的移动次数是这个新下标序列的逆序对数 然后我们要让这个最小,考虑贪心先按h把下标排一遍序,然后每次询问到一种值的时候,对每 ...

  7. bzoj 4240: 有趣的家庭菜园 树状数组+贪心

    有一个小性质:就是一个下标排列的最小移动次数就是逆序对数. 我们发现最终形态一定是一个波峰. 那么我们求的就是形成波峰的下标最少逆序对数. 考虑将元素从小到大依次插入. 那么,对于第 $i$ 个元素, ...

  8. HDU 3333 - Turing Tree (树状数组+离线处理+哈希+贪心)

    题意:给一个数组,每次查询输出区间内不重复数字的和. 这是3xian教主的题. 用前缀和的思想可以轻易求得区间的和,但是对于重复数字这点很难处理.在线很难下手,考虑离线处理. 将所有查询区间从右端点由 ...

  9. 贪心+树状数组维护一下 Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) D

    http://codeforces.com/contest/724/problem/D 题目大意:给你一个串,从串中挑选字符,挑选是有条件的,按照这个条件所挑选出来的字符集合sort一定是最后选择当中 ...

随机推荐

  1. 【uva1658 算法竞赛入门经典】海军上将【费用流】

    题意 给出一个v(3<=v<=1000)个点e(3<=e<=10000)条边的有向加权图,求1-v的两条不相交(除了起点和终点外没有公共点)的路径,使得权和最小. 分析 费用流 ...

  2. 【bzoj3239】Discrete Logging

    [吐槽] 这题和[bzoj]2480一毛一样. 就是输入顺序和输出变了一下. 传送门:http://www.cnblogs.com/chty/p/6043707.html

  3. jQuery autocomplete -默认

    <!doctype html> <html> <head> <meta name="content-type" content=" ...

  4. mybatis中使用懒加载实现一对多复杂查询

    1.包结构 2.pom配置 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&qu ...

  5. #error用法

    #error命令是C/C++语言的预处理命令之一,当预处理器预处理到#error命令时将停止编译并输出用户自定义的错误消息. 语法: #error [用户自定义的错误消息] 注:上述语法成份中的方括号 ...

  6. p4364 [九省联考2018]IIIDX

    传送门 分析 我们先考虑如果所有数都不相同我们应该怎么办 我们可以直接贪心的在每个点放可行的最大权值 但是题目要求可以有相同的数 我们可以考虑每次让当前节点可发且尽量大的同时给兄弟节点留的数尽量大 我 ...

  7. Python爬虫实战六之抓取爱问知识人问题并保存至数据库

    大家好,本次为大家带来的是抓取爱问知识人的问题并将问题和答案保存到数据库的方法,涉及的内容包括: Urllib的用法及异常处理 Beautiful Soup的简单应用 MySQLdb的基础用法 正则表 ...

  8. sql2008 安装提示重启失败

    [转] https://www.cnblogs.com/chenshaogang/p/4313022.html

  9. cannot find -lf2c

    sudo apt-get install libf2c2 auso apt-get install libf2c2-dev

  10. Fix “Could Not Find This Item” When Deleting in Windows 7

    If you’ve been using Windows for as long as I have, you have probably run into your share of weird e ...