题意
给 n n n 种颜色分配 1 − n 1-n 1−n 之间的数字,使得其按题目给定的排列时,同一列上的差值之和最大。
手模样例 1 1 1 后可以发现只要按照最贪(在剩余的可选择中最大配最小)分配,与环内颜色数目的多少没有关系。
对于具有 x x x 种颜色的偶数环,容易想到其中将分配到 x / 2 x/2 x/2 个最大值和最小值,由此在样例 1 1 1 中前四列组成的环能够产生的贡献为 5 、 4 、 4 、 3 5、4、4、3 5、4、4、3,人为操作后可以变成 5 、 5 、 3 、 3 5、5、3、3 5、5、3、3 ,而对于奇数环,可以将 2 、 1 、 1 2、1、1 2、1、1 转化为 2 、 2 2、2 2、2 进行计算,由此推出规律即可。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int numa[N],numb[N],vis[N],ne[N],w[N];
int maxx,minn,sum;
int dfs(int pos){
int res=1;
vis[pos]=1;
while(1){
pos=ne[pos];
if(vis[pos])
break;
vis[pos]=1;
res++;
}
return res;
}
void solve(){
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>numa[i];
for(int i=1;i<=n;i++)
cin>>numb[i];
for(int i=1;i<=n;i++)
ne[numa[i]]=numb[i];
int sum=0,tmp=0;
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++){
if(vis[i])
continue;
int res=dfs(i);
tmp+=res/2;
}
for(int i=0;i<tmp;i++)
sum+=(n-1-2*i)*2;
cout<<sum<<endl;
}
signed main(){
ios_base::sync_with_stdio(0);cin.tie(0); cout.tie(0);
int T;
cin>>T;
while(T--)
solve();
return 0;
}