BZOJ1119[POI2009]SLO && BZOJ1697[Usaco2007 Feb]Cow Sorting牛排序
Problem J: [POI2009]SLO
Time Limit: 30 Sec Memory Limit: 162 MB
Submit: 622 Solved: 302
[Submit][Status][Discuss]
Description
对于一个1-N的排列(ai),每次你可以交换两个数ax与ay(x<>y),代价为W(ax)+W(ay) 若干次交换的代价为每次交换的代价之和。请问将(ai)变为(bi)所需的最小代价是多少。
Input
第一行N。第二行N个数表示wi。第三行N个数表示ai。第四行N个数表示bi。 2<=n<=1000000 100<=wi<=6500 1<=ai,bi<=n ai各不相等,bi各不相等 (ai)<>(bi) 样例中依次交换数字(2,5)(3,4)(1,5)
Output
一个数,最小代价。
Sample Input
2400 2000 1200 2400 1600 4000
1 4 5 3 6 2
5 3 2 4 6 1
Sample Output
HINT
题解:想到置换,发现在一个循环中,我们尽量让每个点与权值小的进行交换,但是这样会是最优吗?
显然不是,我们忽略一种情况,我们可以将另一个循环中的一个最小的值与一个循环的一个节点交换,
然后重复上述操作,再将它换回原来循环来产生更优的解!
细节见代码:
BZOJ1119
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#define ll long long
#define inf 0x7fffffff
#define N 1000010
using namespace std;
int n;
ll v[N],minn=inf,a[N],ans;
int cnt[N];
bool vis[N];
ll read()
{
ll x=,f=; char ch;
while (ch=getchar(),ch<''||ch>'') if (ch=='-') f=-;
while (x=x*+ch-'',ch=getchar(),ch>=''&&ch<='');
return x*f;
}
int main()
{
n=read();
for (int i=; i<=n; i++) v[i]=read(),minn=min(minn,v[i]);
for (int i=; i<=n; i++) a[i]=read();
for (int i=; i<=n; i++) cnt[read()]=i;
for (int i=; i<=n; i++)
{
if (!vis[i])
{
ll t=,mn=inf,sum=; int j=i;
while (!vis[j])
{
vis[j]=; t++; sum+=v[a[j]]; mn=min(mn,v[a[j]]); j=cnt[a[j]];
}
if (t>=)
{
ll t1=sum+1ll*mn*(t-),t2=sum+mn+1ll*minn*(t+);
ans+=min(t1,t2);
}
}
}
printf("%lld\n",ans);
return ;
}
BZOJ1697
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
#define ll long long
#define inf 0x7fffffff
#define N 100005
using namespace std;
struct point{
ll v,pos;
}tmp[N];
ll v[N],minn=inf,a[N],ans;
int cnt[N];
bool vis[N];
ll read()
{
ll x=,f=; char ch;
while (ch=getchar(),ch<''||ch>'') if (ch=='-') f=-;
while (x=x*+ch-'',ch=getchar(),ch>=''&&ch<='');
return x*f;
}
bool cmp(point a,point b){return a.v<b.v;
}
int main()
{
int n=read();
for (int i=; i<=n; i++) v[i]=tmp[i].v=read(),a[i]=tmp[i].pos=i,minn=min(minn,tmp[i].v);
sort(tmp+,tmp+n+,cmp);
for (int i=; i<=n; i++){cnt[tmp[i].pos]=i;}
for (int i=; i<=n; i++)
{
if (!vis[i])
{
ll t=,mn=inf,sum=; int j=i;
while (!vis[j])
{
vis[j]=; t++; sum+=v[a[j]]; mn=min(mn,v[a[j]]); j=cnt[a[j]];
}
if (t>=)
{
ll t1=sum+1ll*mn*(t-),t2=sum+mn+1ll*minn*(t+);
ans+=min(t1,t2);
}
}
}
printf("%lld\n",ans);
return ;
}
BZOJ1119[POI2009]SLO && BZOJ1697[Usaco2007 Feb]Cow Sorting牛排序的更多相关文章
- BZOJ1697: [Usaco2007 Feb]Cow Sorting牛排序
1697: [Usaco2007 Feb]Cow Sorting牛排序 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 387 Solved: 215[S ...
- [BZOJ1697][USACO2007 FEB]Cow Sorting牛排序:贪心+置换
分析 一个月前做的一道题补一下题解,就简单写一写吧. 单独考虑每一个循环节,如果只进行内部的调整,最优方案显然是把最小的绕这个循环交换一圈. 但是借助全局最小值可能使答案更优,两种情况取个\(\max ...
- BZOJ_1697_[Usaco2007 Feb]Cow Sorting牛排序_贪心
BZOJ_1697_[Usaco2007 Feb]Cow Sorting牛排序_贪心 Description 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行 ...
- 【BZOJ 1697】1697: [Usaco2007 Feb]Cow Sorting牛排序
1697: [Usaco2007 Feb]Cow Sorting牛排序 Description 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行动.因为脾气大 ...
- bzoj1697:[Usaco2007 Feb]Cow Sorting牛排序 & bzoj1119:[POI2009]SLO
思路:以bzoj1119为例,题目已经给出了置换,而每一次交换的代价是交换二者的权值之和,而置换一定是会产生一些环的,这样就可以只用环内某一个元素去置换而使得其余所有元素均在正确的位置上,显然要选择环 ...
- bzoj 1119 [POI2009]SLO && bzoj 1697 [Usaco2007 Feb]Cow Sorting牛排序——思路(置换)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1119 https://www.lydsy.com/JudgeOnline/problem.p ...
- P1697: [Usaco2007 Feb]Cow Sorting牛排序
这是一道置换群的裸题=-=,先拿来试试手对着打,以后应该会更加熟练吧! ; var n,i,j,maxx,minx,now,len,cursum,tmin,sum:longint; p:array[. ...
- BZOJ 1697: [Usaco2007 Feb]Cow Sorting牛排序
Description 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行动.因为脾气大的牛有可能会捣乱,JOHN想把牛按脾气的大小排序.每一头牛的脾气都是一个 ...
- 【BZOJ】1697: [Usaco2007 Feb]Cow Sorting牛排序(置换群)
http://www.lydsy.com/JudgeOnline/problem.php?id=1697 置换群T_T_T_T_T_T_T 很久以前在黑书和白书都看过,,,但是看不懂... 然后找了本 ...
随机推荐
- JVM CPU打满问题定位
1.线程不释放,导致Old区占满,系统不停的FullGC 发现应用并没有在进行FGC,而是进行频繁的YGC. YGC也存在异常,S1和S0区域都是从0直接跳到99% 观察堆大小装太发现Young区内存 ...
- nginx初级安装配置
nginx初级安装配置 转自:(lykyl原创)http://www.cnblogs.com/lykyl/archive/2012/11/21/2781077.html 实验环境:系统 CENTOS5 ...
- C++设计模式-单件
理解 1. Singleton模式用来取代全局静态变量.C++通过静态成员变量来实现类实例全局唯一性. 2. instance()方法是单件提供的唯一调用入口. 要点 1. ...
- 单词接龙(dragon)
单词接龙(dragon) 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次) ...
- HTML5 学习01
HTML的英语意思是:Hypertext Marked Language,即超文本标记语言,是一种用来制作超文本文档的简单标记语言. 所谓超文本,是因为它可以加入图片.声音.动画.影视等内容,事实上每 ...
- HDU 3715 Go Deeper
二分答案 + 2-SAT判断 #include<cstdio> #include<cstring> #include<cmath> #include<vect ...
- opencart配置
1.安装opencart 2.修改后台目录(慎重,修改后插件安装会出错) Opencart默认的后台是网站/admin这样子,很多人可以猜到这种组合对于正式生产环境很不安全,我们可以把这个admin改 ...
- tinkphp5.0 traits 的引入
Traits引入 ThinkPHP 5.0开始采用trait功能(PHP5.4+)来作为一种扩展机制,可以方便的实现一个类库的多继承问题. trait是一种为类似 PHP 的单继承语言而准备的代码复用 ...
- 转 Android网络编程之使用HttpClient批量上传文件 MultipartEntityBuilder
请尊重他人的劳动成果,转载请注明出处:Android网络编程之使用HttpClient批量上传文件 http://www.tuicool.com/articles/Y7reYb 我曾在<Andr ...
- 高并发数据库之MySql性能优化
1.慢查询 SHOW VARIABLES LIKE '%quer%'