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

6
2400 2000 1200 2400 1600 4000
1 4 5 3 6 2
5 3 2 4 6 1

Sample Output

11200

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=0,f=1; char ch;while (ch=getchar(),ch<'0'||ch>'9') if (ch=='-') f=-1;while (x=x*10+ch-'0',ch=getchar(),ch>='0'&&ch<='9');return x*f;
}
int main()
{n=read();for (int i=1; i<=n; i++) v[i]=read(),minn=min(minn,v[i]);for (int i=1; i<=n; i++) a[i]=read();for (int i=1; i<=n; i++) cnt[read()]=i;for (int i=1; i<=n; i++){if (!vis[i]){ll t=0,mn=inf,sum=0; int j=i;while (!vis[j]){vis[j]=1; t++; sum+=v[a[j]]; mn=min(mn,v[a[j]]); j=cnt[a[j]]; }if (t>=2){ll t1=sum+1ll*mn*(t-2),t2=sum+mn+1ll*minn*(t+1);ans+=min(t1,t2); }}} printf("%lld\n",ans);return 0;
}

View Code

BZOJ1697

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<cstdio>
 6 #define ll long long
 7 #define inf 0x7fffffff
 8 #define N 100005
 9 using namespace std;
10 struct point{
11     ll v,pos;
12 }tmp[N];
13 ll v[N],minn=inf,a[N],ans;
14 int cnt[N];
15 bool vis[N];
16 ll read()
17 {
18     ll x=0,f=1; char ch;
19     while (ch=getchar(),ch<'0'||ch>'9') if (ch=='-') f=-1;
20     while (x=x*10+ch-'0',ch=getchar(),ch>='0'&&ch<='9');
21     return x*f;
22 }
23 bool cmp(point a,point b){return a.v<b.v;
24 }
25 int main()
26 {
27     int n=read();
28     for (int i=1; i<=n; i++) v[i]=tmp[i].v=read(),a[i]=tmp[i].pos=i,minn=min(minn,tmp[i].v);
29     sort(tmp+1,tmp+n+1,cmp);
30     for (int i=1; i<=n; i++){cnt[tmp[i].pos]=i;}
31     for (int i=1; i<=n; i++)
32     {
33         if (!vis[i])
34         {
35             ll t=0,mn=inf,sum=0; int j=i;
36             while (!vis[j])
37             {
38                 vis[j]=1; t++; sum+=v[a[j]]; mn=min(mn,v[a[j]]); j=cnt[a[j]];
39             }
40             if (t>=2)
41             {
42                 ll t1=sum+1ll*mn*(t-2),t2=sum+mn+1ll*minn*(t+1);
43                 ans+=min(t1,t2);
44             }
45         }
46     }
47     printf("%lld\n",ans);
48     return 0;
49 }

View Code

转载于:https://www.cnblogs.com/HQHQ/p/5952992.html

BZOJ1119[POI2009]SLO BZOJ1697[Usaco2007 Feb]Cow Sorting牛排序相关推荐

  1. bzoj 1697: [Usaco2007 Feb]Cow Sorting牛排序(置换)

    1697: [Usaco2007 Feb]Cow Sorting牛排序 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 706  Solved: 413 ...

  2. BZOJ 1631: [Usaco2007 Feb]Cow Party【最短路】

    1631: [Usaco2007 Feb]Cow Party [题目描述] 传送门 题解 正向建边,从X开始刷一趟SPFA,然后反向建边,从X刷一趟SPFA,最后两次的答案加和就可以了. 代码如下 # ...

  3. poj 3268 bzoj 1631: [Usaco2007 Feb]Cow Party(最短路)

    1631: [Usaco2007 Feb]Cow Party Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 855  Solved: 613 [Subm ...

  4. [Usaco2007 Feb]Cow Party 奶牛派对

    好了,好久没发题解,这次来一发SPFA,看题: Description 农场有N(1≤N≤1000)个牛棚,每个牛棚都有1只奶牛要参加在X牛棚举行的奶牛派对.共有M(1≤M≤100000)条单向 路连 ...

  5. P5200 [USACO19JAN]Sleepy Cow Sorting 牛客假日团队赛6 D 迷路的牛 (贪心)

    链接:https://ac.nowcoder.com/acm/contest/993/E 来源:牛客网 对牛排序 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ...

  6. 1633: [Usaco2007 Feb]The Cow Lexicon 牛的词典(DP)

    1633: [Usaco2007 Feb]The Cow Lexicon 牛的词典 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 633  Solved ...

  7. 1696: [Usaco2007 Feb]Building A New Barn新牛舍

    1696: [Usaco2007 Feb]Building A New Barn新牛舍 Time Limit: 5 Sec   Memory Limit: 64 MB Submit: 378   So ...

  8. bzoj 1698: [Usaco2007 Feb]Lilypad Pond 荷叶池塘(BFS)

    1698: [Usaco2007 Feb]Lilypad Pond 荷叶池塘 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 550  Solved: 1 ...

  9. bzoj 1696: [Usaco2007 Feb]Building A New Barn新牛舍

    1696: [Usaco2007 Feb]Building A New Barn新牛舍 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 481  Solv ...

  10. bzoj 1632: [Usaco2007 Feb]Lilypad Pond(BFS)

    1632: [Usaco2007 Feb]Lilypad Pond Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 688  Solved: 230 [S ...

最新文章

  1. python序列_科学网—Python:序列(字符串、列表、元组)和序列函数 - 刘洋洋的博文...
  2. C语言——日常刷题(一)
  3. node更新到最新版本_云顶之弈10.24版本临时更新永恩、劫大砍,最新上分阵容推荐...
  4. javascript   卸载事件(onunload)
  5. QT的QPlace类的使用
  6. python 的datetime模块使用
  7. NLP太难学了!?吃透NLP的方法来拿走
  8. SDN精华问答 | 为什么会出现SDN?
  9. java发送http post请求报文_Java 用HTTP的方式发送JSON报文请求
  10. 阿里云、腾讯云、华为云哪个好?迄今最全面的云服务评测报告出炉(转)
  11. android 获取高德地图坐标,获取地址描述数据-获取地图数据-开发指南-Android 地图SDK | 高德地图API...
  12. svn up出现类似svn: Error converting entry in directory ‘.‘ to UTF-8问题解决
  13. 开源的屏幕画笔工具(基于WPF InkCanvas)
  14. java如何让图片自适应屏幕_CSS实现背景图片屏幕自适应
  15. CAD插件的安装和自动加载dll、arx
  16. 用HTML写出能转换成合适的PDF文件(A4纸张大小)的相关问题和方法
  17. 优化移动网站的9大窍门(转)
  18. Mysql-explain-Impossible WHERE noticed after reading const tables
  19. 什么是政微助手?政微助手是干什么用的?
  20. 大学计算机基础 教学要求,《大学计算机基础》课程教学大纲

热门文章

  1. 如何在苹果设备上查看 Apple Pay 交易?
  2. iOS开发之算法加密md5,sha1,AES,base64
  3. MacOS如何设置不使用时退出登录用户账号
  4. 快捷笔记应用Side Notes Mac
  5. Kontakt 6 for Mac崩溃时常用的几种解决方案
  6. web 实现分页打印功能
  7. css模块化配置---webpack4+less
  8. 有趣的mysql string和0比较返回1的问题
  9. 号外号外~~OSS监控服务上线啦!!
  10. HTML5全球普及加速:有望终结iOS与安卓界限【转】