BestCoder Round #58 LCS
2016-05-18 17:31
323 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5495
题意:给我们两个序列a和b,这两个序列的元素都是1~n,问我们能否给出一个排列方式,使得a和b经过这个排列方式的变化后的最长公共子序列最长。
a和b的排列方式都是根据一个排列方式变化的,所以很明显每一位的a的值和b的值是绑定了的,也就是排列方式一定是一起移动的,那么我们完全可以直接搜索就能得到一个最终的答案。
题意:给我们两个序列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; }
相关文章推荐
- 如何在终端关闭火狐
- Angularjs国际化
- Android requestWindowFeature崩溃
- 转解决java向pdf中写值
- 单例模式的七种写法
- 面试的几个小问题?
- Ehcache详细解读
- string[][]和string[,] 以及 int[][]和int[,]
- 学习JavaScript闭包
- RTC 之 ARM7 2136 ARM9之2410
- 重置mysql密码
- UltraEdit 多词搜索
- vi 基本命令
- Bootstrap教程JS插件滚动监听学习笔记分享
- Problem B - Run Step 2015 ACM/ICPC Greater New York Region
- poj 3694Network 双联通分量+lca
- zk客户端命令
- java ThreadLocal 自己的一些见解
- getCompoundDrawables
- ipython for win7 安装