JOSWAP - Just One Swap
题目分析
简单排列组合题。每个数可以换到除了他以外的所有位置。
我们设
则每个数可以换到的位置有
我们需要求的
然后你就 WA 了,如果有两个相同的数则他们互换可以得到原来的序列,需要特判!
代码实现
#include<bits/stdc++.h>
#define int long long //warning!
using namespace std;
int T,n,a[100001],ans;
bool f;
map<int,int>mp;//如题目分析
signed main(){
for(cin>>T;T;--T){
mp.clear();//清空
cin>>n;
ans=f=0;//重置
for(int i=1;i<=n;i++){
cin>>a[i];
mp[a[i]]++;//增加
}
for(int i=1;i<=n;i++){
if(mp[a[i]]>1)//特判!
f=1;
ans+=(n-mp[a[i]]);//求和
}
cout<<ans/2+f<<'\n';//多测勿忘换行
}
return 0;
}