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 ...
随机推荐
- Oppotunity land---China
China is a land of opportunity.Following the development of China,every sector has made their contri ...
- MSAA
多重采样抗锯齿(MultiSampling Anti-Aliasing,簡稱MSAA)是一种特殊的超级采样抗锯齿(SSAA).MSAA首先来自于OpenGL.具体是MSAA只对Z缓存(Z-Buffer ...
- windowopen
1.最基本的弹出窗口代码] <SCRIPT LANGUAGE="javascript"> <!-- window.open ('page.html') --> ...
- 常见的排序算法之Java代码解释
一 简要介绍 一般排序均值的是将一个已经无序的序列数据重新排列成有序的 常见的排序分为: 1 插入类排序 主要就是对于一个已经有序的序列中,插入一个新的记录.它包括:直接插入排序,折半插入排序和希尔排 ...
- POJ3461 Oulipo KMP算法
这个算法去年的这个时候就已经听过了,看毛片算法哈哈..不过理解它确实花了我很久的时间..以致于我一直很排斥字符串的学习,因为总觉得太难了,但是有些硬骨头还是要啃的,这个寒假就啃啃字符串还有一些别的东西 ...
- Project Euler 100 : Arranged probability 安排概率
Arranged probability If a box contains twenty-one coloured discs, composed of fifteen blue discs and ...
- 朴素贝叶斯方法(Naive Bayes Method)
朴素贝叶斯是一种很简单的分类方法,之所以称之为朴素,是因为它有着非常强的前提条件-其所有特征都是相互独立的,是一种典型的生成学习算法.所谓生成学习算法,是指由训练数据学习联合概率分布P(X,Y ...
- 查看服务器的TCP/IP(http)连接情况
6.那具体到,怎样监听一个具体程序的TCP/IP连接情况呢???!! 就要用:netstat -n|grep 80 命令来查看具体端口对应程序的TCP/IP连接情况了 netstat -n|grep ...
- React测试Mixin
1.test.jsx var randomNumberMixin = require("./randomNumberMixin.jsx"); describe("test ...
- 删除元素 不存在 NO 存在 输出余下元素
#include<stdio.h> #include<stdlib.h> #define N 5 #define NULL 0 #define OK 1 #define ERR ...