HDU - 5495

题目链接:HDU - 5495


其实就是每一列可以重排,然后问LCS。

我们可以发现,把 b 看成 a 的置换,那么每个环的贡献都是环的大小 - 1 。特判环为1,贡献为1。


AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=1e5+10;
int vis[N],a[N],b[N],res,cnt,n;
void solve(){
	scanf("%d",&n); res=0;
	for(int i=1;i<=n;i++)	scanf("%d",&a[i]),vis[i]=0;
	for(int i=1;i<=n;i++)	scanf("%d",&b[a[i]]);
	for(int i=1;i<=n;i++)	if(!vis[i]){
		int now=i; cnt=0;
		while(!vis[now])	vis[now]=1,cnt++,now=b[now];
		res+=max(1,cnt-1);
	}
	printf("%d\n",res);
}
signed main(){
	int T; cin>>T; while(T--) solve();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43826249/article/details/107871857
hdu