P2782 友好城市(DP 状态设计,VAI,转化,LIS)

\(\text{VAI}\),即 \(\text{value as index}\),答案作为数组下标。
首先可以对于北岸城市排序,从前向后考虑。
想到设 \(f(i)\) 表示匹配 \(i\) 个时最少 ban 掉南岸前 \(f(i)\) 个城市。
转移可以二分去做。

回看一下,其实就是求最长上升子序列。

#include<bits/stdc++.h>
using namespace std;
const int N=200009,inf=1e9;
int n,dp[N],cnt;
pair<int,int> a[N];
int main(){
    scanf("%d",&n),dp[0]=-inf;
    for(int i=1;i<=n;i++) dp[i]=inf,scanf("%d%d",&a[i].first,&a[i].second);
    sort(a+1,a+n+1);
    for(int i=1,x,pos;i<=n;i++){
        x=a[i].second;
        cnt=max(cnt,pos=(lower_bound(dp,dp+cnt+1,x)-dp));
        dp[pos]=min(dp[pos],x);
//        printf("add %d->%d\n",x,cnt);
//        for(int it=1;it<=cnt;it++) printf("%d ",dp[it]);
//        putchar('\n');
    }
    printf("%d\n",cnt);
    return 0;
}

posted @ 2026-02-04 20:56  2025ing  阅读(1)  评论(0)    收藏  举报