[agc006E]Rotate 3x3
Description
给你一个3*N的网格,位置为(i,j)的网格上的数为i+3(j-1)。每次选一个3*3的网格旋转180度,问最后能否使得网格(i,j)的值为ai,j。(5≤N≤105)
如图:
Solution
依图可看出,所谓的旋转就是将选择的3*3网格左右列交换,并且3列都进行翻转。
设正列(如1,2,3)为小写字母,反列(如3,2,1)为大写字母。
假如有相邻5列:
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
a d C b e
c D A b e
c B a d e
A b C d e
我们可以在有5列可供操纵的情况下将任意相隔1列的两列翻转而不影响其他。
在最终答案中设下标为奇的反列个数为x,下表为偶的个数为y。
先不考虑翻转问题,将奇列和偶列分开考虑(因为在处理奇列的时候只会翻转却不会影响偶列的具体数值)。由于如果初始矩阵操作后变为矩阵a,则矩阵a一定能变为初始矩阵,我们按照列的权值从小到大将矩阵a恢复为初始矩阵。处理奇列时,每翻转一次,就会翻转一个偶列,偶列也是同样道理。我们计算出奇列、偶列被翻转次数的奇偶性,与x、y比较即可。
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int n,a[][];
int need_swap[],real_swap[];
int num[],id[];
int tree[];
void add(int _id,int x){for(;_id<=n;_id+=_id&-_id) tree[_id]+=x;}
int query(int _id){int re=;for(;_id;_id-=_id&-_id) re+=tree[_id];return re;}
int main()
{
scanf("%d",&n);
for (int j=;j<;j++)
for (int i=;i<=n;i++)
scanf("%d",&a[j][i]);
for (int i=;i<=n;i++)
for (int j=;j<;j++)
{
if ((a[][i]^i)&) { printf("No");return ;}
if (a[][i]==a[][i]+&&a[][i]==a[][i]+&&a[][i]%!=)
{
need_swap[i&]++;num[i]=a[][i]/+;id[num[i]]=i;continue;
}
if (a[][i]==a[][i]-&&a[][i]==a[][i]-&&a[][i]%!=)
{
num[i]=a[][i]/+;id[num[i]]=i;continue;
}
printf("No");return ;
}
int cnt;
for (int i=;i<=n;i+=)
{
cnt=id[i]+*(i/-query(id[i]));
real_swap[]+=abs(i-cnt)/;
add(id[i],);
}
memset(tree,,sizeof(tree));
for (int i=;i<=n;i+=)
{
cnt=id[i]+*(i/--query(id[i]));
real_swap[]+=abs(i-cnt)/;
add(id[i],);
}
real_swap[]%=;real_swap[]%=;need_swap[]%=;need_swap[]%=;
if (real_swap[]!=need_swap[]||real_swap[]!=need_swap[]) printf("No");
else printf("Yes");
}
[agc006E]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 显然每一列只能一起动,乱动则无解. 对原网格按列黑白染色,显然每一列数只能在相同颜色之间交换,乱动则无解. 之后考虑构造方案. ...
- Agc_006 E Rotate 3x3
题目大意 给定一个$3\times N$的方阵,每个位置的数恰好是每一个$[1,3\times N]$中的数. 初始时,每个位置$[x,y]$填的是$3(y-1)+x,(1\leq x\leq N,1 ...
- AT2166 Rotate 3x3
传送门 这个题网上有两种做法,一种是树状数组的,还有一种是暴力模拟的,暴力模拟显然不够优美,所以我用的树状数组 显然可以从初状态推到目标状态,我们也可以考虑倒推回去 首先可以容易发现每列的数字是不变的 ...
- AtCoder刷题记录
构造题都是神仙题 /kk ARC066C Addition and Subtraction Hard 首先要发现两个性质: 加号右边不会有括号:显然,有括号也可以被删去,答案不变. \(op_i\)和 ...
- 贪心/构造/DP 杂题选做Ⅲ
颓!颓!颓!(bushi 前传: 贪心/构造/DP 杂题选做 贪心/构造/DP 杂题选做Ⅱ 51. CF758E Broken Tree 讲个笑话,这道题是 11.3 模拟赛的 T2,模拟赛里那道题的 ...
- AtCoder Grand Contest 006
AtCoder Grand Contest 006 吐槽 这套题要改个名字,叫神仙结论题大赛 A - Prefix and Suffix 翻译 给定两个串,求满足前缀是\(S\),后缀是\(T\),并 ...
随机推荐
- cascade属性
cascade属性是设置级联操作的也就是在操作一端的数据如果影响到多端数据时会进行级联操作,一对一的时候直接写在标签上,其他的要写在set标签上 cascade="none|save-upd ...
- centos虚拟机安装,配置静态ip可以访问网络
centos安装过程中需要注意几个问题 1.选择安装的软件 默认选择的是mininal,应该选择GNEME Desktop 安装的过程中可以设置network 配置linux网络命令 具体配置 退出键 ...
- angularJs中的模块化操作
一.全局的写法 有可能会跟其他程序有冲突 <!DOCTYPE HTML> <html ng-app="myApp"> <head> <me ...
- C++作用域 (二)
http://www.cnblogs.com/wolf-lifeng/p/3156936.html 2.3全局作用域 2.3.1概述 全局作用域是最大的名字空间作用域,不同于用户自定义的名字空间作用域 ...
- 8、Web Service-IDEA-jaxws规范下的 spring整合CXF
前提:开发和之前eclipse的开发有很大的不同! 1.服务端的实现 1.新建项目 此时创建的是web项目 2.此时创建的项目是不完整的需要开发人员手动补充完整 3.对文件夹的设置(满满的软件使用方法 ...
- Spring(十二)之JDBC框架
JDBC 框架概述 在使用普通的 JDBC 数据库时,就会很麻烦的写不必要的代码来处理异常,打开和关闭数据库连接等.但 Spring JDBC 框架负责所有的低层细节,从开始打开连接,准备和执行 SQ ...
- linux日志log查询常用命令
一般的log文件都是需要过滤 1.grep 过滤查找 查询ip 221.2.100.138的log grep '221.2.100.138' web.access.log grep 221.2.10 ...
- Sublime插件WakaTime使用
1.安装WakaTime插件 ctrl+shift+p-->输入pi-->回车-->输入wakaTime-->回车(进行安装) 安装好后会显示输入api key的输入栏 (也可 ...
- Luogu_2774 方格取数问题
Luogu_2774 方格取数问题 二分图最小割 第一次做这种题,对于某些强烈暗示性的条件并没有理解到. 也就是每一立刻理解到是这个图是二分图. 为什么? 横纵坐标为奇数的只会和横纵坐标为偶数的相连. ...
- Gradle Goodness: Renaming Files while Copying
With the Gradle copy task we can define renaming rules for the files that are copied. We use the ren ...