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;
}

浙公网安备 33010602011771号