题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5495
题意:给我们两个序列a和b,这两个序列的元素都是1~n,问我们能否给出一个排列方式,使得a和b经过这个排列方式的变化后的最长公共子序列最长。
a和b的排列方式都是根据一个排列方式变化的,所以很明显每一位的a的值和b的值是绑定了的,也就是排列方式一定是一起移动的,那么我们完全可以直接搜索就能得到一个最终的答案。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 100000+5;
int vis[maxn];
struct Node
{int a,b;
}p[maxn];
int cmp(Node a,Node b)
{return a.a < b.a;
}
int main()
{int T;scanf("%d",&T);while(T--){int n;scanf("%d",&n);for(int i=1; i<=n; i++) scanf("%d",&p[i].a);for(int i=1; i<=n; i++) scanf("%d",&p[i].b);memset(vis,0,sizeof(vis));sort(p+1,p+n+1,cmp);int ans = 0;for(int i=1; i<=n; i++){if(vis[i]) continue;vis[i] = 1;if(p[i].a == p[i].b) ans++;else{int pos = p[i].b;while(!vis[pos]){ans++;vis[pos] = 1;pos = p[pos].b;}}}printf("%d\n",ans);}return 0;
}