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 ...
随机推荐
- .NET MongoDB Driver 2.2使用示例
说明:mongoDBService是对各种常用操作的封装 public class MongoDBService { #region 变量 /// <summary> /// 缓存 /// ...
- 完整CentOS搭建OpenVPN服务详细教程
一.介绍 1.定义 ① OpenVPN是一个用于创建虚拟专用网络加密通道的软件包,最早由James Yonan编写.OpenVPN允许创建的VPN使用公开密钥.电子证书.或者用户名/密码来进行身份验证 ...
- [国嵌攻略][048][MMU配置与使用]
MMU配置与使用 1.通过点亮LED使用虚拟地址来使用MMU,采用段页映射方式 2.任务步骤:1.建立一级页表 2.写入TTB 3.打开MMU 代码编写 1.虚拟地址的段地址0xA0000000,一级 ...
- HDU 2412 Farm Irrigation
题目: Benny has a spacious farm land to irrigate. The farm land is a rectangle, and is divided into a ...
- hbase性能调优_表设计案例
hbase性能调优案例 1.人员-角色 人员有多个角色 角色优先级 角色有多个人员 人员 删除添加角色 角色 可以添加删除人员 人员 角色 删除添加 设计思路 person表 ...
- java包装类简析
对于8个基本类型,java提供了他们相应的包装类: 基本类型 包装类 byte java.lang.Byte short java.lang.Short int java.lang.Integer l ...
- 数据库 MySQL进阶之索引
数据库的索引非常重要,基本面试数据库的问题都在索引上,所以这里小编整理出来,一方面为了自己复习,一方面也方便大家. 一,索引前传 在了解数据库索引之前,首先有必要了解一下数据库索引的数据结构基础,那么 ...
- 引导图滤波(Guided Image Filtering)原理以及OpenCV实现
引导图是一种自适应权重滤波器,能够在平滑图像的同时起到保持边界的作用,具体公式推导请查阅原文献<Guided Image Filtering>.这里只说一下自适应权重原理.C++实现灰度图 ...
- RMQ算法 (ST算法)
概述: RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中 ...
- intent详解(一)
摘录自:http://blog.csdn.net/harvic880925/article/details/38399723 前言:通过重新翻看Android入门书籍,才发现原来自己露掉了那么多基础知 ...