RT
#include<bits/stdc++.h>
using namespace std;
struct ZS{
int a,id;
bool operator <(const ZS b)const{return a<b.a;}
}t[100005];
int n,minn,m;
int a[100005],b[100005];
long long ans,s;
bool vis[100005];
inline int read(){
int ret=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
while(isdigit(ch)){ret=ret*10+ch-'0';ch=getchar();}
return ret*f;
}
int main(){
// freopen("P2127.in","r",stdin);
// freopen("P2127.out","w",stdout);
n=read();
for(int i=1;i<=n;i++)a[i]=t[i].a=read(),t[i].id=i;
sort(t+1,t+1+n);minn=t[1].a;
for(int i=1;i<=n;i++)b[t[i].id]=i;
for(int i=1;i<=n;i++)if(!vis[i]){
int j=i,len=0;m=1<<30;s=0;
while(!vis[j])vis[j]=1,m=min(m,a[j]),s+=a[j],j=b[j],len++;
ans+=min((long long)s+(long long)(len-2)*m,(long long)s+m+(long long)(len+1)*minn);
}
printf("%lld\n",ans);
return 0;
}
以上是我的代码
这是题解代码
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define LL long long
#define inf 2147483647
LL n,a[100006],b[100006],MIN,pos[100006],siz,sum,minn;
bool vis[100006];
LL ans;
void dfs(int x)
{
if(vis[x])return ;
sum+=a[x]; //记录环内每个点的总和
siz++; //环内有多少个点
MIN=min(MIN,a[x]); //环内最小值
vis[x]=1; //打上标记
dfs(pos[x]); //下一个点
}
int main()
{
// freopen("P2127.in","r",stdin);
// freopen("P21270.out","w",stdout);
scanf("%d",&n);
minn=MIN=inf;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
b[i]=a[i];
minn=min(minn,a[i]); //记录序列最小值
}
sort(b+1,b+1+n); //排序
for(int i=1;i<=n;i++)
pos[i]=lower_bound(b+1,b+1+n,a[i])-b; //记录排序后的位置
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
dfs(i);
ans+=min(sum+MIN+minn*(siz+1),sum+MIN*(siz-2));
/*
方法一:交换序列最小值和环内最小值 + 序列最小值 * 环内点数
方法二:环内最小值*环内点数。
*/
siz=0; sum=0; MIN=inf;
}
}
printf("%lld",ans);
}
我的代码交上去RE,0分,题解100
但是在本地对拍一点毛病都没有,在IDE上也测试过样例了似乎也没有UB
所以可能是什么问题=-=,调了1h了没搞出来