HDU - 5495

题目链接:HDU - 5495


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

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


AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include
//#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;
}

你可能感兴趣的:(思维题,HDU,置换)