#include<bits/stdc++.h>
using namespace std;
const int MAXN=50050;
long long a[MAXN],fin[MAXN],fa[MAXN],sum[MAXN],siz[MAXN],mna[MAXN];
int findfa(int x)
{
if(fa[x]==x)
return x;
else
return fa[x]=findfa(fa[x]);
}
int main()
{
long long n,i,mn,ans;
while(~scanf("%lld",&n))
{
for(i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
fin[i]=a[i];
fa[i]=i;
}
sort(fin+1,fin+n+1);
mn=1<<30;
for(i=1;i<=n;i++)
{
mn=min(mn,a[i]);
if(a[i]!=fin[i])
fa[findfa(i)]=findfa(lower_bound(fin+1,fin+n+1,a[i])-fin);
}
for(i=1;i<=n;i++)
{
mna[i]=1<<30;
siz[i]=sum[i]=0;
}
for(i=1;i<=n;i++)
{
siz[findfa(i)]++;
sum[findfa(i)]+=a[i];
mna[findfa(i)]=min(mna[findfa(i)],a[i]);
}
ans=0;
for(i=1;i<=n;i++)
{
if(findfa(i)==i&&siz[i]>1)
{
ans+=min(sum[i]+(siz[i]-2)*mna[i],sum[i]+(siz[i]+1)*mn+mna[i]);
}
}
printf("%lld\n",ans);
}
}
51nod 1125 交换机器的最小代价
最新推荐文章于 2020-07-04 16:24:51 发布