ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[51nod1125]交换机器的最小代价

2022-07-17 20:14:20  阅读:137  来源: 互联网

标签:typedef int 最小 long 最小值 全局 代价 51nod1125 mod


设每个数最终的位置是$p_i$, 每个数当前的位置是$i$, 由于数是独一无二的, 所以pi - i是一一映射的关系

然后我们让$i -> p_i$, 建立一个图

那么, 考虑一个环, 我们可以让最小的值沿着来边走一$n-1$步($n$是环的大小), 亦或是让最小值和全局最小值交换一下, 让全局最小值来代替他走一圈, 再把全局最小值交换回去

(感觉显然是对的)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
#define pb push_back
#define ln '\n'
const int N = 2e5+5;
const int mod = 998244353;
inline void inc(int &a, int b){
    a+=b;
    if(a>=mod) a-=mod;
}
inline void dec(int &a, int b){
    a-=b;
    if(a<0) a+=mod;
}
int n, p[N], f[N], mn[N], siz[N];
int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
ll sum[N];
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> n;
    vector<int> b;
    for(int i=1; i<=n; i++) cin >> p[i], b.pb(p[i]);
    sort(b.begin(), b.end());
    for(int i=1; i<=n; i++)
    	p[i] = lower_bound(b.begin(), b.end(), p[i])-b.begin() + 1;
    for(int i=1; i<=n; i++)
    	f[i] = i, sum[i] = mn[i] = b[p[i]-1], siz[i] = 1;
    for(int i=1; i<=n; i++){
    	int fx = find(i), fy = find(p[i]);
    	if(fx != fy){
    		f[fy] = fx; 
    		sum[fx] += sum[fy]; 
    		mn[fx] = min(mn[fx], mn[fy]); 
    		siz[fx] += siz[fy];
    	}
    }
    ll ans = 0;
    for(int i=1; i<=n; i++)
    	if(f[i] == i){
    		ll tmp1 = sum[i] - mn[i] + 1ll * mn[i] * (siz[i]-1);
    		ll tmp2 = sum[i] - mn[i] + 1ll * b[0] * (siz[i]-1) + (b[0]+mn[i])*2;
    		//把1跟最小值换一下, 然后让1走一圈, 然后换回来
    		ans = ans + min(tmp1, tmp2);
    	}
    cout << ans << ln;
}

  

标签:typedef,int,最小,long,最小值,全局,代价,51nod1125,mod
来源: https://www.cnblogs.com/gllonkxc/p/16488172.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有