LA3510 Pixel Shuffle
题意
分析
思路挺简单的,题目中的每个命令(包括命令的逆)相当于一个置换。
用\(O(n^2k)\)的时间复杂度从右往左求出这些置换的乘积A,然后求m使Am = I(I为全等置换)
还是先把A分解循环,m则等于所有循环节长度的最小公倍数。
代码
#include<bits/stdc++.h>
#define rg register
#define il inline
#define co const
template<class T>il T read(){
rg T data=0,w=1;rg char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') w=-1;ch=getchar();}
while(isdigit(ch)) data=data*10+ch-'0',ch=getchar();
return data*w;
}
template<class T>il T read(rg T&x) {return x=read<T>();}
typedef long long ll;
using namespace std;
int gcd(int a,int b) {return b?gcd(b,a%b):a;}
int lcm(int a,int b) {return a/gcd(a,b)*b;}
#define ID(i,j) ((i)*n+(j))
int newpos(int n,int i,int j,co char*op){
if(op[0]=='r') return ID(n-1-j,i); // rot
if(op[0]=='s') return ID(i,n-1-j); // sym
if(op[0]=='b'&&op[1]=='h') // bhsym
return i<n/2?ID(i,j):ID(i,n-1-j);
if(op[0]=='b'&&op[1]=='v') // bvsym
return i<n/2?ID(i,j):ID(n/2+n-i-1,j);
if(op[0]=='d')
return i%2==0?ID(i/2,j):ID(n/2+i/2,j);
if(op[0]=='m'){
int k=i/2;
if(j<n/2)
return i%2==0?ID(2*k,2*j):ID(2*k,2*j+1);
else
return i%2==0?ID(2*k+1,2*(j-n/2)):ID(2*k+1,2*(j-n/2)+1);
}
return assert(op[0]=='i'),ID(i,j);
}
co int N=1024;
int orig[N*N];
void apply(int*image,int n,co char*op){
bool inv=op[strlen(op)-1]=='-';
copy(image,image+n*n,orig);
for(int i=0;i<n;++i)for(int j=0;j<n;++j){
int p=ID(i,j),p2=newpos(n,i,j,op);
if(!inv) image[p2]=orig[p];
else image[p]=orig[p2];
}
}
int vis[N*N];
int solve(int*p,int n){
fill(vis,vis+n,0);
int ans=1;
for(int i=0,j,len;i<n;++i)if(!vis[i]){
j=i,len=0;
do vis[j]=1,j=p[j],++len;
while(j!=i);
ans=lcm(ans,len);
}
return ans;
}
int cur[N*N];
int main(){
// freopen(".in","r",stdin),freopen(".out","w",stdout);
int T,n,n2;
read(T),read(n);
for(;T--;n=n2){
for(int i=0;i<n*n;++i) cur[i]=i;
vector<string> ops;
for(int i=0;;++i){
static char op[10];
if(scanf("%s",op)==EOF) break;
if(isdigit(op[0])) {sscanf(op,"%d",&n2);break;}
ops.push_back(op);
}
for(int i=ops.size()-1;i>=0;--i)
apply(cur,n,ops[i].c_str());
printf("%d\n",solve(cur,n*n));
if(T) puts("");
}
return 0;
}
LA3510 Pixel Shuffle的更多相关文章
- UVA 1156 - Pixel Shuffle(模拟+置换)
UVA 1156 - Pixel Shuffle 题目链接 题意:依据题目中的变换方式,给定一串变换方式,问须要运行几次才干回复原图像 思路:这题恶心的一比,先模拟求出一次变换后的相应的矩阵,然后对该 ...
- LA 3510 (置换 循环分解) Pixel Shuffle
思路挺简单的,题目中的每个命令(包括命令的逆)相当于一个置换. 用O(n2k)的时间复杂度从右往左求出这些置换的乘积A,然后求m使Am = I(I为全等置换) 还是先把A分解循环,m则等于所有循环节长 ...
- UVALive - 3510 Pixel Shuffle (置换)
题目链接 有一个n*n的图像和7种置换,以及一个置换序列,求将这个序列重复做几次能得到原图像. 将这些置换序列乘起来可得到一个最终置换,这个置换所有循环节的长度的lcm即为答案. 注意置换是从右往左进 ...
- Learning to Promote Saliency Detectors
Learning to Promote Saliency Detectors 原本放在了思否上, 但是公式支持不好, csdn广告太多, 在博客园/掘金上发一下 https://github.com/ ...
- 上采样 及 Sub-pixel Convolution (子像素卷积)
参考:https://blog.csdn.net/leviopku/article/details/84975282 参考:https://blog.csdn.net/g11d111/article/ ...
- Speech Super Resolution Generative Adversarial Network
博客作者:凌逆战 博客地址:https://www.cnblogs.com/LXP-Never/p/10874993.html 论文作者:Sefik Emre Eskimez , Kazuhito K ...
- AI:IPPR的数学表示-CNN稀疏结构进化(Mobile、xception、Shuffle、SE、Dilated、Deformable)
接上一篇:AI:IPPR的数学表示-CNN基础结构进化(Alex.ZF.Inception.Res.InceptionRes). 抄自于各个博客,有大量修改,如有疑问,请移步各个原文..... 前言 ...
- Spark Shuffle原理、Shuffle操作问题解决和参数调优
摘要: 1 shuffle原理 1.1 mapreduce的shuffle原理 1.1.1 map task端操作 1.1.2 reduce task端操作 1.2 spark现在的SortShuff ...
- Collections.shuffle
1.Collections.shuffler 最近有个需求是生成十万级至百万级的所有随机数,最简单的思路是一个个生成,生成新的时候排重,但是这样时间复杂度是o(n^2),网上看了几个博客的解决方法都不 ...
随机推荐
- hibernate创建构架
创建hibernate架构: 注意:需要将所需的架包导进去: 二:Java工程的具体结构: 具体代码如下:hibernate.cfg.xml <!DOCTYPE hibernate-config ...
- bzoj2946
题解: 和poj1226差不多 把翻转去掉 然后不要忘记开大数组和二分的上限答案 代码: #include<bits/stdc++.h> using namespace std; type ...
- :代理模式:proxy
#ifndef __PROXY_H__ #define __PROXY_H__ class Subject { public: Subject(){} virtual ~Subject(){} vir ...
- 使用AWR报告诊断Oracle性能问题
在做单交易负载测试时,有的交易响应时间超出了指标值,在排除完测试环境等可能造成交易超时的原因后,去分析数据库问题.数据库用的是Oracle,对于Oracle数据库整体的性能问题, awr的报告是一个非 ...
- python笔记7-if中的is ;in ;not搭配用法
names="111 222 333" print("111" in names)#返回的是True,用in返回的是布尔值in在里面 print("1 ...
- matlab中diff的用法
若是diff(),括号里的元素为向量,那么前一个减后一个即为diff后的结果: 若diff(),括号里的元素为矩阵,那么下一行减上一行即为diff 后的结果:
- 未完全弄懂的题的题51nod1532
转载自:https://blog.csdn.net/luricheng/article/details/527520941352 集合计数 基准时间限制:1 秒 空间限制:131072 KB 分值: ...
- 集合(ArrayList)简述
ArrayList创建变量的步骤 1.导入包java.util.ArrayList; 2.创建引用类型的变量 数据类型<集合存储的数据类型> 变量名=new 数据类型<集合存储的数据 ...
- outlook2016中如何设置两个账户都自动有各自默认签名
安装了Outlook2016以后,有些朋友不清楚,我们在发送邮件的时候,怎么添加邮件签名,其实在Outlook2016中添加邮件签名的方法也是比较简单的,这里小编介绍下在Outlook2016中设置添 ...
- 审计系统---堡垒机项目之strace追踪ssh
strace 追踪ssh的进程ID,记录操作的命令[实际上是内核里面记录的东西],进行操作日志的Py解析达到效果. 修改ssh源码添加访问标志位 源码下载:[本文示例:openssh-7.4p1.ta ...