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

用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. ListView防止滑动变色的小技巧

    listview滑动时会变成白色,如果背景色不是白色的话可以通过设置setCacheColorHint(Color.TRANSPARENT);来避免变色,.对应的xml也可以进行设置.

  2. mysql安装篇

    装了vps,环境又要自己配置.mysql比较难装上. 1.安装MySQL 5.5.x的yum源:rpm -Uvh http://repo.webtatic.com/yum/centos/5/lates ...

  3. JQuery,UIbootstrap风格弹出层

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> <met ...

  4. C# 正则表达式 匹配IP地址

    \b(([01]?\d?\d|2[0-4]\d|25[0-5])\.){3}([01]?\d?\d|2[0-4]\d|25[0-5])\b

  5. .bash_profile备份

    # ~/.bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User sp ...

  6. Javascript操作表格隔行变色

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  7. 2014多校第一场A题 || HDU 4861 Couple doubi

    题目链接 题意 : 有K个球,给你一个数P,可以求出K个值,(i=1,2,...,k) : 1^i+2^i+...+(p-1)^i (mod p).然后女朋友先取,再xp取,都希望赢,如果女朋友能赢输 ...

  8. PKUSC 模拟赛 day2 下午总结

    终于考完了,下午身体状况很不好,看来要锻炼身体了,不然以后ACM没准比赛到一半我就挂掉了 下午差点AK,有一道很简单的题我看错题面了所以没有A掉 第一题显然是非常丝薄的题目 我们很容易通过DP来O(n ...

  9. 什么是struts2?

    一.我对struts2的理解. 1.struts2 是一个按MVC模式设计放入web层框架,其实它就是一个servlet.这个servlet命名为ActionServlet,或者是它的一个子类.它的工 ...

  10. ios开发--高德地图SDK使用简介

    高德LBS开放平台将高德最专业的定位.地图.搜索.导航等能力,以API.SDK等形式向广大开发者免费开放.本章节我们来简单学习一下如何使用它的定位及地图SDK. 一.相关框架及环境配置 地图SDK 对 ...