题意: 解法: 如果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; }