其他分享
首页 > 其他分享> > C. Tokitsukaze and Two Colorful Tapes_并查集+环

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

作者:互联网

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