ABC206 D - KAIBUNsyo(思维,并查集求连通块大小)
Posted live4m
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ABC206 D - KAIBUNsyo(思维,并查集求连通块大小)相关的知识,希望对你有一定的参考价值。
题意:
解法:
如果a[i]!=a[n-i+1],那么a[i]需要变成a[n-i+1],或者a[n-i+1]需要变成a[i],
考虑将点a[i]和a[n-i+1]建边,
那么会形成若干连通块,可以用并查集维护连通块.
容易想到每个连通块中的数,要变为同一种数,
因此在维护连通性的时候,也维护连通块的大小,
对于每个连通块,设大小为cnt,那么ans+=cnt-1.
code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxm=4e6+5;
int pre[maxm];
int cnt[maxm];
int a[maxm];
int n;
int ffind(int x){
return pre[x]==x?x:pre[x]=ffind(pre[x]);
}
void solve(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=2e5;i++)pre[i]=i,cnt[i]=1;
for(int i=1;i<=n/2;i++){
int l=a[i],r=a[n-i+1];
if(l==r)continue;
int x=ffind(l),y=ffind(r);
if(x!=y){
pre[x]=y;
cnt[y]+=cnt[x];
}
}
int ans=0;
for(int i=1;i<=2e5;i++){
if(pre[i]==i){
ans+=cnt[i]-1;
}
}
cout<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);
solve();
return 0;
}
以上是关于ABC206 D - KAIBUNsyo(思维,并查集求连通块大小)的主要内容,如果未能解决你的问题,请参考以下文章