3080 道路規劃

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;
}
發佈了28 篇原創文章 · 獲贊 0 · 訪問量 5413
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章