POJ置换群入门[3/3]
POJ 3270 Cow Sorting
题意:
一个序列变为升序,操作为交换两个元素,代价为两元素之和,求最小代价
题解:
看了黑书...
首先循环因子分解
一个循环完成的最小代价要么是循环中最小元素依次与其他交换,要么引入全局最小值来交换
$sum+min(mn*(len-2),mn+Min*(len+1))$
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=1e4+,M=1e5+;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x*f;
}
int n,a[N],c[M],Min=M,m;
int f[N],ans;
bool vis[N];
int main(){
//freopen("in","r",stdin);
n=read();
for(int i=;i<=n;i++)
a[i]=read(),c[a[i]]++,Min=min(Min,a[i]),m=max(m,a[i]);
for(int i=;i<=m;i++) c[i]+=c[i-];
for(int i=;i<=n;i++) f[i]=c[a[i]];
for(int i=;i<=n;i++) if(!vis[i]){
vis[i]=;
int u=f[i],sum=a[i],mn=a[i],len=;
while(u!=i) vis[u]=,sum+=a[u],mn=min(mn,a[u]),len++,u=f[u];
ans+=sum+min(mn*(len-),mn+Min*(len+));
}
printf("%d",ans);
}
POJ2369 Permutations
题意:
求一个置换的几次幂得到自身
题解:
每个循环长度的最小公倍数
注意是几次幂不是转换了几次!!!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=1e3+;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x*f;
}
int n,a[N],ans=;
inline int gcd(int a,int b){return b==?a:gcd(b,a%b);}
inline int lcm(int a,int b){return a/gcd(a,b)*b;}
bool vis[N];
int main(){
//freopen("in","r",stdin);
n=read();
for(int i=;i<=n;i++) a[i]=read();
for(int i=;i<=n;i++) if(!vis[i]){
vis[i]=;
int u=a[i],len=;
while(u!=i) vis[i]=,len++,u=a[u];
ans=lcm(ans,len);
}
printf("%d",ans);
}
POJ1721CARDS
题意:
交换规则为$i \rightarrow a[a[i]]$,进行了$s$次,给出最后的排列求一开始
题解:
一直尝试构造置换的逆一直失败,也许是因为每次合成的置换都不同吧
网上的做法是暴力找整个置换的循环然后把剩下的操作补出来...感觉会被卡...
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x*f;
}
int n,s,a[N],t[N],b[N];
int main(){
freopen("in","r",stdin);
n=read();s=read();
for(int i=;i<=n;i++) b[i]=a[i]=read();
int cnt=;
while(true){
int flag=;
cnt++;
for(int i=;i<=n;i++) t[i]=a[a[i]];
for(int i=;i<=n;i++){
a[i]=t[i];
if(a[i]!=b[i]) flag=;
}
if(flag) break;
}
cnt=cnt-s%cnt;
while(cnt--){
for(int i=;i<=n;i++) t[i]=a[a[i]];
for(int i=;i<=n;i++) a[i]=t[i];
}
for(int i=;i<=n;i++) printf("%d\n",a[i]);
}
POJ置换群入门[3/3]的更多相关文章
- [转] POJ图论入门
最短路问题此类问题类型不多,变形较少 POJ 2449 Remmarguts' Date(中等)http://acm.pku.edu.cn/JudgeOnline/problem?id=2449题意: ...
- ACM题集以及各种总结大全!
ACM题集以及各种总结大全! 虽然退役了,但是整理一下,供小弟小妹们以后切题方便一些,但由于近来考试太多,顾退役总结延迟一段时间再写!先写一下各种分类和题集,欢迎各位大牛路过指正. 一.ACM入门 关 ...
- ACM题集以及各种总结大全(转)
ACM题集以及各种总结大全! 虽然退役了,但是整理一下,供小弟小妹们以后切题方便一些,但由于近来考试太多,顾退役总结延迟一段时间再写!先写一下各种分类和题集,欢迎各位大牛路过指正. 一.ACM入门 关 ...
- poj 3254 状压dp入门题
1.poj 3254 Corn Fields 状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相 ...
- poj 3841 Double Queue (AVL树入门)
/****************************************************************** 题目: Double Queue(poj 3481) 链接: h ...
- poj 2823 Sliding Window (单调队列入门)
/***************************************************************** 题目: Sliding Window(poj 2823) 链接: ...
- poj 1741 树的点分治(入门)
Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 18205 Accepted: 5951 Description ...
- Oil Deposits(poj 1526 DFS入门题)
http://poj.org/problem?id=1562 ...
- POJ P2318 TOYS与POJ P1269 Intersecting Lines——计算几何入门题两道
rt,计算几何入门: TOYS Calculate the number of toys that land in each bin of a partitioned toy box. Mom and ...
随机推荐
- EMC题
[面试题]EMC易安信面试题解 1. 除以59的余数是多少. 来自wiki:费马小定理是数论中的一个定理:假如a是一个整数,p是一个質数,那么 如果a不是p的倍数,这个定理也可以写成 这个书写方式更加 ...
- GO开发[五]:golang结构体struct
Go结构体struct Go语言的结构体(struct)和其他语言的类(class)有同等的地位,但Go语言放弃了包括继承在内的大量面向对象特性,只保留了组合(composition)这个最基础的特性 ...
- WPF 简单的循环GIF播放
//MVVM要事件绑定,记得项目引用类库“Sysrem.Windows.interactivity”,然后XAML引用 xmlns:i="http://schemas.microsoft.c ...
- LNMP下FTP服务器的安装和使用(Pureftpd和Proftpd)
FTP是网站文件维护中使用比较多的,目前LNMP一键安装包中有Pureftpd和Proftpd服务器安装脚本,LNMP默认不安装任何FTP服务器,需要用户自行安装(1.2开始不再提供proftpd的安 ...
- 【编程技巧】Ext.MessageBox 大集合 不同的dialog图解加写法
1.alert对话框 效果图: function a1(){ Ext.MessageBox.alert('title','text'); } 2.confirm案例,确定不确定2个按钮对话框 效果图 ...
- 高质量JAVA代码编写规范
1. Java 命名约定 除了以下几个特例之外,命名时应始终采用完整的英文描述符.此外,一般应采用小写字母,但类名.接口名以及任何非初始单词的第一个字母要大写. 1.1 一般概念 * 尽量使用完整的英 ...
- border样式?
border样式? 设置边框样式: border:宽度 外形 颜色:(自动设置顺序:top,right,bottom,left) boeder-top:宽度 外形 颜色:(单独为某一个边边框设置样式) ...
- common-logging--源码之SimpleLog
common-logging源码Log接口 在common-logging的源码中,将log核心类抽象成了一个Log接口. 这里贴出Log接口的源码: /* * Licensed to the Apa ...
- js实现最短时间走完不同速度的路程
题目: 现在有一条公路,起点是0公里,终点是100公里.这条公路被划分为N段,每一段有不同的限速.现在他们从A公里处开始,到B公里处结束.请帮他们计算在不超过限速的情况下,最少需要多少时间完成这段路程 ...
- java ecplise配置
运行java项目首先配置java运行时环境:Window->Preferences->Java->Installed JREs 修改为jdk:C:\Program Files\Jav ...