Task
給兩行數1-n的序列,相同的數連線,求最大的集合滿足集合中任意兩個數都相交。
Solution
比賽的時候想歪了,認爲它求最大獨立集。於是把任意不相交的兩個數之間連邊,
求出的一個最大獨立集必定是任意兩個都相交的。但是!但是!匈牙利算法是用來求二分圖的最大獨立集的,但是構建的圖並不一定是二分圖。
正解=反向求LIS。如果x,y是相交的,觀察第二行,發現符合逆序對的概念,如果這個集合中任意兩個都是逆序對,那麼這個集合一定是一個單調遞減的序列。
const int M=1e5+5;
int id[M],A[M],dp[M];
int n;
inline void input(){
int i,j,k;
rd(n);
rep(i,0,n-1)rd(k),id[k]=i;
rep(i,0,n-1)rd(k),A[i]=id[k];
}
inline void solve(){
int i;
memset(dp,0x3f,sizeof(dp));
per(i,n-1,0)
*lower_bound(dp,dp+n,A[i])=A[i];
printf("%d\n",lower_bound(dp,dp+n,dp[n+1])-dp);
}
int main(){
input();
solve();
return 0;
}