思路挺简单的,题目中的每个命令(包括命令的逆)相当于一个置换。

用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的更多相关文章

  1. LA 3641 (置换 循环的分解) Leonardo's Notebook

    给出一个26个大写字母的置换B,是否存在A2 = B 每个置换可以看做若干个循环的乘积.我们可以把这些循环看成中UVa 10294的项链, 循环中的数就相当于项链中的珠子. A2就相当于将项链旋转了两 ...

  2. UVA 1156 - Pixel Shuffle(模拟+置换)

    UVA 1156 - Pixel Shuffle 题目链接 题意:依据题目中的变换方式,给定一串变换方式,问须要运行几次才干回复原图像 思路:这题恶心的一比,先模拟求出一次变换后的相应的矩阵,然后对该 ...

  3. UVALive - 3510 Pixel Shuffle (置换)

    题目链接 有一个n*n的图像和7种置换,以及一个置换序列,求将这个序列重复做几次能得到原图像. 将这些置换序列乘起来可得到一个最终置换,这个置换所有循环节的长度的lcm即为答案. 注意置换是从右往左进 ...

  4. UVa 11330 (置换 循环的分解) Andy's Shoes

    和UVa11077的分析很类似. 我们固定左脚的鞋子不动,然后将右脚的鞋子看做一个置换分解. 对于一个长度为l的循环节,要交换到正确位置至少要交换l-1次. #include <cstdio&g ...

  5. UVa 11077 (循环分解 递推) Find the Permutations

    把{1, 2, 3,,, n}叫做自然排列 本题便是求有多少个n元排列P要至少经过k次交换才能变为自然排列. 首先将排列P看做置换,然后将其分解循环,对于每个长度为i的循环至少要交换i-1次才能归位. ...

  6. LA3510 Pixel Shuffle

    题意 PDF 分析 思路挺简单的,题目中的每个命令(包括命令的逆)相当于一个置换. 用\(O(n^2k)\)的时间复杂度从右往左求出这些置换的乘积A,然后求m使Am = I(I为全等置换) 还是先把A ...

  7. Leonardo的笔记本LA 3641——置换的乘法

    题意 给出26个大写字母的置换 $B$,问是否存在一个置换 $A$,使得 $A^2=B$. 分析 首先,若A=BC,若B和C都能表示成两个相同循环的乘积,则A也能. 因为,不相交的循环的乘积满足交换律 ...

  8. for 循环分解

    for (expression1; expression2; expression3) { statement; } statement称为循环体 expression1为初始化部分,只在循环开始前执 ...

  9. poj 3270(置换 循环)

    经典的题目,主要还是考思维,之前在想的时候只想到了在一个循环中,每次都用最小的来交换,结果忽略了一种情况,还可以选所有数中最小的来交换一个循环. Cow Sorting Time Limit: 200 ...

随机推荐

  1. Oracle 中 for update 和 for update nowait 的区别

    原文出处http://bijian1013.iteye.com/blog/1895412 一.for update 和 for update nowait 的区别 首先一点,如果只是select 的话 ...

  2. java集合类(三)About Iterator & Vector(Stack)

    接上篇:java集合类学习(二) Talk about “Iterator”: 任何容器类,在插入元素后,还需要取回元素,因为这是容器的最基本工作.对于一般的容器,插入有add()相关方法(List, ...

  3. [book]awesome-machine-learning books

    https://github.com/josephmisiti/awesome-machine-learning/blob/master/books.md Machine-Learning / Dat ...

  4. EBP与ESP寄存器的使用

    push ebp mov esp,ebp esp是堆栈指针 ebp是基址指针 这两条指令的意思是将栈顶指向ebp的地址 ---------------------------------------- ...

  5. TensorFlow 基本使用

    使用 TensorFlow, 你必须明白 TensorFlow: 使用图 (graph) 来表示计算任务. 在被称之为 会话 (Session) 的上下文 (context) 中执行图. 使用 ten ...

  6. Application.persistentDataPath 的一个小坑

    打包之前在Android的Player Setting里面选择WriteAccess (写入访问) Internal Only:表示Application.persistentDataPath的路径是 ...

  7. springMVC+ibatis数据持久化入门级学习例子

    1.web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version=" ...

  8. PHP 打印函数之 print print_r

    print 说明 int print ( string $arg ) 输出 arg print 实际上不是一个函数(它是一个语言结构),因此你可以不必使用圆括号来括起它的参数列表 参数 arg:输入数 ...

  9. HDU 1598 find the most comfortable road(枚举+并查集,类似于最小生成树)

    一开始想到用BFS,写了之后,发现有点不太行.网上查了一下别人的解法. 首先将边从小到大排序,然后从最小边开始枚举,每次取比它大的边,直到start.end属于同一个集合,即可以连通时停止.过程类似于 ...

  10. 【转】12 款优秀的 JavaScript MVC 框架评估

    JavaScript MVC 框架有很多,不同框架适合于不同项目需求.了解各种框架的性能及优劣有利于我们更加快捷的开发.作者(Gordon L.Hempton)一直在寻求哪种MVC框架最为完美,他将目 ...