(第一道蓝题)
据说是用了hash的思想(?)
总之是先把第一个序列每个数出现的顺序记下来(其实第一个序列的数字不用记),
然后第二个序列的每个数都对照它的顺序,这样只要得到一个升序的序列就行了qwq
如果遇到出现顺序在前面的数,就用二分法找一下它的位置,然后把原来存下来的顺序覆盖掉
#include<cstdio> using namespace std; int f[100005],ans[100005]; int n,sum; int k,l,r,now,mid; int main() { scanf("%d",&n); for(int i = 1; i <= n; i++) { scanf("%d",&k); f[k] = i; } for(int i = 1; i <= n; i++) { scanf("%d",&k); now = f[k]; if(now > ans[sum]) ans[++sum] = now; else { l = 1,r = sum; while(l < r) { mid = (l+r)/2; if (ans[mid]<now)l = mid+1; else r = mid; } ans[l] = now; } } printf("%d",sum); return 0; }
原文地址:https://www.cnblogs.com/mogeko/p/9859379.html
时间: 2024-11-09 03:38:57