ICode9

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

C. Tokitsukaze and Two Colorful Tapes_并查集+环

2022-05-13 12:02:17  阅读:216  来源: 互联网

标签:Tapes fa int rep 查集 Tokitsukaze vct mp find


C. Tokitsukaze and Two Colorful Tapes_并查集+环

题目大意

给ab两个数组,他们均是n的排列。现在要在满足原来ai==bj的仍旧相等的条件下,重新排列ab,使得sum(abs(ai-bi))最大。

思路和代码

比较好看的就是这是一堆环。我们贪心的去给每个环一大一小的去分配数字即可。要注意其实奇数环和偶数环是一样的。如下图中只要把点5拿掉即可。

struct dsu{
	vct<int> fa ;
	dsu(int n){
		fa.resize(n + 1) ;
		rep(i , 0 , fa.size() - 1) fa[i] = i ;
	}
	int find(int u){
		return fa[u] == u ? u : find(fa[u]) ;
	}
	void merge(int u , int v){
		fa[find(u)] = find(v) ;
	}
};

int n , m , k ; 

void solve(){
	cin >> n ;
	dsu d(n) ;
	map<int , int> mp ;//维护环尺寸 
	vct<int> a(n + 1 , 0) ;
	vct<int> b(n + 1 , 0) ;
	rep(i , 1 , n) cin >> a[i] ;
	rep(i , 1 , n) cin >> b[i] ;
	rep(i , 1 , n) d.merge(a[i] , b[i]) ;
	
	rep(i , 1 , n) mp[d.find(i)] ++ ;
	
	ll ans = 0 ;
	vct<ll> p(n + 1 , 0) ;
	rep(i , 1 , n) p[i] = p[i - 1] + i ;
	ll l = 1 , r = n ;
	for(auto node : mp){
		int cnt = node.se ;
		if(cnt == 1) continue ;
//		cout << cnt << "\n" ;
		int l2 = l + cnt / 2 - 1 ;
		int r2 = r - cnt / 2 + 1 ;
		ans += 2 * ((p[r] - p[r2 - 1]) - (p[l2] - p[l - 1])) ;
		l = l2 + 1 , r = r2 - 1 ;
	}
	cout << ans << "\n" ;
	
}//code_by_tyrii 

小结

和这题很像

C. Where is the Pizza?_并查集 - tyrii

标签:Tapes,fa,int,rep,查集,Tokitsukaze,vct,mp,find
来源: https://www.cnblogs.com/tyriis/p/16266156.html

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

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

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

ICode9版权所有