Description

Data Constraint

Solution
这道题我们可以将题目想成一个个点对,设编号为i的南北城市在南北分别为(ai,bi),那么显然一个相交的点对(i,j)为(aj>ai,bi>bj),那么我们可以将点对按a的大小排序,对b做一遍最长不下降子序列即可。时间复杂度O(NlogN).
代码
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100005;
int n,i,t,j,k,l,num,x,y,f[maxn],r,mid;
struct code{
int a,b;
}a[maxn];
bool cmp(code x,code y){
return x.a<y.a;
}
int main(){
scanf("%d",&n);
for (i=1;i<=n;i++)
scanf("%d",&x),a[x].a=i;
for (i=1;i<=n;i++)
scanf("%d",&x),a[x].b=i;
sort(a+1,a+n+1,cmp);
for (i=1;i<=n;i++){
if (f[num]>a[i].b || !num) f[++num]=a[i].b;
else{
l=1;r=num;
while (l<r){
mid=(l+r)/2;
if (f[mid]>a[i].b) l=mid+1;else r=mid;
}
if (f[l]<a[i].b) f[l]=a[i].b;
}
}
printf("%d\n",num);
}