LA 3510 (置换 循环分解) Pixel Shuffle
思路挺简单的,题目中的每个命令(包括命令的逆)相当于一个置换。
用O(n2k)的时间复杂度从右往左求出这些置换的乘积A,然后求m使Am = I(I为全等置换)
还是先把A分解循环,m则等于所有循环节长度的最小公倍数。
需要注意的是:
执行命令是从右往左执行的,这是题目中说的=_=
其他命令还好,mix那个命令把我搞得晕头转向,题中给的是反的,我们要反过来求原图像(i, j)在新图像中的位置。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
using namespace std; int gcd(int a, int b)
{ return b == ? a : gcd(b, a%b); } int lcm(int a, int b)
{ return a / gcd(a, b) * b; } const int maxn = ;
int n;
char s[], op[][]; inline int ID(int i, int j)
{ return i*n + j; } int newpos(int i, int j, const char* op)
{
if(op[] == 'r') return ID(n-j-, i);
if(op[] == 's') return ID(i, n-j-);
if(op[] == 'b' && op[] == 'h')
{
if(i >= n/) return ID(i, n-j-);
return ID(i, j);
}
if(op[] == 'b' && op[] == 'v')
{
if(i >= n/) return ID(n-(i-n/)-, j);
return ID(i, j);
}
if(op[] == 'd')
{
if(i & ) return ID(n/ + i/ ,j);
return ID(i/, j);
}
if(op[] == 'm')
{
int k = i/;
if(j < n/) return i % == ? ID(k*, j*) : ID(k*, j*+);
else return i % == ? ID(*k+, *(j-n/)) : ID(*k+, *(j-n/)+);
}
return ID(i, j);
} int cur[maxn * maxn], origin[maxn * maxn]; void apply(const char* op)
{
for(int i = ; i < n*n; i++) origin[i] = cur[i];
bool inv = op[strlen(op)-] == '-' ? true : false;
for(int i = ; i < n; i++)
for(int j = ; j < n; j++)
{
int p = ID(i, j), p2 = newpos(i, j, op);
if(inv) cur[p] = origin[p2];
else cur[p2] = origin[p];
}
} bool vis[maxn * maxn]; int solve()
{
memset(vis, false, sizeof(vis));
int ans = ;
for(int i = ; i < n*n; i++) if(!vis[i])
{
int cnt = , j = i;
do
{
vis[j] = ;
cnt++;
j = cur[j];
}while(j != i);
ans = lcm(cnt, ans);
}
return ans;
} int main()
{
//freopen("in.txt", "r", stdin); int T;
scanf("%d", &T);
for(int kase = ; kase < T; kase++)
{
if(kase) puts(""); scanf("%d", &n); getchar();
string line, temp;
getline(cin, line);
stringstream ss(line);
vector<string> op;
while(ss >> temp) op.push_back(temp); for(int i = ; i < n*n; i++) cur[i] = i;
for(int i = op.size() - ; i >= ; i--) apply(op[i].c_str());
printf("%d\n", solve());
} return ;
}
代码君
LA 3510 (置换 循环分解) Pixel Shuffle的更多相关文章
- LA 3641 (置换 循环的分解) Leonardo's Notebook
给出一个26个大写字母的置换B,是否存在A2 = B 每个置换可以看做若干个循环的乘积.我们可以把这些循环看成中UVa 10294的项链, 循环中的数就相当于项链中的珠子. A2就相当于将项链旋转了两 ...
- UVA 1156 - Pixel Shuffle(模拟+置换)
UVA 1156 - Pixel Shuffle 题目链接 题意:依据题目中的变换方式,给定一串变换方式,问须要运行几次才干回复原图像 思路:这题恶心的一比,先模拟求出一次变换后的相应的矩阵,然后对该 ...
- UVALive - 3510 Pixel Shuffle (置换)
题目链接 有一个n*n的图像和7种置换,以及一个置换序列,求将这个序列重复做几次能得到原图像. 将这些置换序列乘起来可得到一个最终置换,这个置换所有循环节的长度的lcm即为答案. 注意置换是从右往左进 ...
- UVa 11330 (置换 循环的分解) Andy's Shoes
和UVa11077的分析很类似. 我们固定左脚的鞋子不动,然后将右脚的鞋子看做一个置换分解. 对于一个长度为l的循环节,要交换到正确位置至少要交换l-1次. #include <cstdio&g ...
- UVa 11077 (循环分解 递推) Find the Permutations
把{1, 2, 3,,, n}叫做自然排列 本题便是求有多少个n元排列P要至少经过k次交换才能变为自然排列. 首先将排列P看做置换,然后将其分解循环,对于每个长度为i的循环至少要交换i-1次才能归位. ...
- LA3510 Pixel Shuffle
题意 PDF 分析 思路挺简单的,题目中的每个命令(包括命令的逆)相当于一个置换. 用\(O(n^2k)\)的时间复杂度从右往左求出这些置换的乘积A,然后求m使Am = I(I为全等置换) 还是先把A ...
- Leonardo的笔记本LA 3641——置换的乘法
题意 给出26个大写字母的置换 $B$,问是否存在一个置换 $A$,使得 $A^2=B$. 分析 首先,若A=BC,若B和C都能表示成两个相同循环的乘积,则A也能. 因为,不相交的循环的乘积满足交换律 ...
- for 循环分解
for (expression1; expression2; expression3) { statement; } statement称为循环体 expression1为初始化部分,只在循环开始前执 ...
- poj 3270(置换 循环)
经典的题目,主要还是考思维,之前在想的时候只想到了在一个循环中,每次都用最小的来交换,结果忽略了一种情况,还可以选所有数中最小的来交换一个循环. Cow Sorting Time Limit: 200 ...
随机推荐
- 如何在Eclipse中配置Tomcat服务器
之前使用MyEclipse来开发Web应用,可以在MyEclipse中配置服务器,配置完后,直接运行服务器即可,很方便. 最近切换到Eclipse开发环境,发现使用Tomcat的方式不太一样,因此在此 ...
- CSS3属性box-shadow使用教程,css3box-shadow
CSS3的box-shadow属性可以让我们轻松实现图层阴影效果.我们来实战详解一下这个属性. 1. box-shadow属性的浏览器兼容性先来看一个这个属性的浏览器兼容性: Opera: 不知道是从 ...
- 汇编中Enter与Leave指令
Enter的作用相当==push ebp和mov ebp,esp 这后面两句大家很熟悉吧?函数开始一般都是这两句 Leave的作用相当==mov esp,ebp和pop ebp 而这后面这两句也很常见 ...
- wordpress数据库优化-关闭日志修订
每次在wordpress网站修改文章的时候都会产生一个修订版本,wp_posts会产生一个post_type为“REVISIONS”的记录,修改次数一多的话,那修订版本就有几万条记录了 在functi ...
- java数据结构学习(一)之二分查找
二分查找法与我们在孩童时期玩过的猜数的游戏一样,这个游戏里一个朋友会让你猜他正想的一个1至100的数,当你猜了一个数后,他会告诉你三种选择的一个:你猜的比她想的大,或小,或猜中了.为了能用最少的次 ...
- Java 网络编程 字符流的发送与接收 自定义数据边界
在网络编程中,客户端调用了flush方法,就会将缓存在字符流中的文本发送给服务器,服务器该怎样判断客户端发送的文本已经结束了呢? 我们先看一个例子: 客户端: import java.io.IOExc ...
- UML建模之活动图介绍(Activity Diagram)
一.活动图的组成元素 Activity Diagram Element 1.活动状态图(Activity) 2.动作状态(Actions) 3.动作状态约束(Action Constraints) 4 ...
- 从零开始,让你的框架支持CocoaPods
本文为投稿文章,作者:奴良(简书) 这两天一直琢磨着想让自己的一个照片多选框架支持CocoaPods下载安装,就搜了好多资料,但是搜到的资料大多都是最基本的,并没有解决我遇到的问题,问题如下: 当自己 ...
- AO总结10:MapControl控件
MapControl对应ArcMap中的数据视图,它封装了Map对象,并提供了额外的属性.方法.事件用于: 1 管理控件的外观.显示属性和地图属性 2 添加并管理控件中的数据层 3 装载Map文档控件 ...
- Csharp日常笔记
1. 1.退出程序 this.Close(); //方法退关闭当前窗口. Application.Exit(); //方法退出整 ...