bzoj1697:[Usaco2007 Feb]Cow Sorting牛排序 & bzoj1119:[POI2009]SLO
Posted DUXT
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj1697:[Usaco2007 Feb]Cow Sorting牛排序 & bzoj1119:[POI2009]SLO相关的知识,希望对你有一定的参考价值。
思路:以bzoj1119为例,题目已经给出了置换,而每一次交换的代价是交换二者的权值之和,而置换一定是会产生一些环的,这样就可以只用环内某一个元素去置换而使得其余所有元素均在正确的位置上,显然要选择环内最小的数,但也可能存在一个数使得它不在当前处理的环内而它先与当前环内某个数进行交换,然后再在环内进行交换,再将之前那个数换回来,这样也显然要选择所有元素中最小的和当前环内最小的进行交换,然后取个min即可。然后还要注意可能当前环内最小的就是所有元素中最小的,特判一下即可。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 #define maxn 1000100 8 #define inf 1e9 9 10 int n,minval=inf,tot; 11 long long ans; 12 int a[maxn],pos[maxn],b[maxn],val[maxn],next[maxn]; 13 bool vis[maxn]; 14 15 int read(){ 16 int x=0,f=1;char ch=getchar(); 17 for (;ch<\'0\'||ch>\'9\';ch=getchar()) if (ch==\'-\') f=-1; 18 for (;ch>=\'0\' && ch<=\'9\';ch=getchar()) x=x*10+ch-\'0\'; 19 return x*f; 20 } 21 22 int main(){ 23 n=read(); 24 for (int i=1;i<=n;i++) val[i]=read(),minval=min(minval,val[i]); 25 for (int i=1;i<=n;i++) a[i]=read(),pos[a[i]]=i; 26 for (int i=1;i<=n;i++) b[i]=read(),next[pos[a[i]]]=pos[b[i]]; 27 for (int i=1;i<=n;i++) 28 if (!vis[i]){ 29 long long sum=0;int size=0,v=inf; 30 while (!vis[i]) vis[i]=1,size++,sum+=val[a[i]],v=min(v,val[a[i]]),i=next[i]; 31 if (size<=1) continue; 32 long long ans1=sum-v+1ll*v*(size-1),ans2=sum+v+1ll*minval*(size+1); 33 if (v!=minval) ans+=min(ans1,ans2);else ans+=ans1; 34 } 35 printf("%lld\\n",ans); 36 }
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 #define maxn 100100 8 #define inf 1e9 9 10 int n,minval=inf,ans; 11 int tmp[maxn],val[maxn],pos[maxn],next[maxn]; 12 bool vis[maxn]; 13 14 int read(){ 15 int x=0,f=1;char ch=getchar(); 16 for(;ch<\'0\' || ch>\'9\';ch=getchar())if (ch==\'-\') f=-1; 17 for(;ch>=\'0\' && ch<=\'9\';ch=getchar()) x=x*10+ch-\'0\'; 18 return x*f; 19 } 20 21 int main(){ 22 n=read(); 23 for (int i=1;i<=n;i++) tmp[i]=val[i]=read(),pos[val[i]]=i,minval=min(minval,val[i]); 24 sort(tmp+1,tmp+n+1); 25 for (int i=1;i<=n;i++) next[pos[tmp[i]]]=pos[val[i]]; 26 for (int i=1;i<=n;i++){ 27 int sum=0,size=0,v=inf; 28 while (!vis[i]) vis[i]=1,size++,sum+=val[i],v=min(v,val[i]),i=next[i]; 29 if (size<=1) continue; 30 int ans1=sum+v*(size-2),ans2=sum+minval*(size+1)+v; 31 if (minval!=v) ans+=min(ans1,ans2);else ans+=ans1; 32 } 33 printf("%d\\n",ans); 34 return 0; 35 }
以上是关于bzoj1697:[Usaco2007 Feb]Cow Sorting牛排序 & bzoj1119:[POI2009]SLO的主要内容,如果未能解决你的问题,请参考以下文章
bzoj 1697: [Usaco2007 Feb]Cow Sorting牛排序置换群
BZOJ1697: [Usaco2007 Feb]Cow Sorting牛排序
bzoj 1697: [Usaco2007 Feb]Cow Sorting牛排序
bzoj 1119 [POI2009]SLO && bzoj 1697 [Usaco2007 Feb]Cow Sorting牛排序——思路(置换)
bzoj1697:[Usaco2007 Feb]Cow Sorting牛排序 & bzoj1119:[POI2009]SLO