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