3080 道路规划

1 篇文章 0 订阅

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值