【JZOJ4810】道路规划

Description

这里写图片描述

Solution

我们把第一行的数与第二行相等的数相连,假设第i个数在第二行出现的位置为 ci ,如果 i,j 有交叉,那么要满足, i<j ci>cj

那么这就是一个最长下降子序列了。

Code

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define fo(i,j,k) for(int i=j;i<=k;i++)
#define fd(i,j,k) for(int i=j;i>=k;i--)
#define N 100100
using namespace std;
struct node{
    int x,y;
}q[N];
int a[N],b[N];
bool cmp(node x,node y)
{
    return x.x<y.x;
}
int d[N],t=0;
int main()
{
    int n;
    cin>>n;
    fo(i,1,n) scanf("%d",&a[i]);
    fo(i,1,n) scanf("%d",&q[i].x),q[i].y=i;
    sort(q+1,q+n+1,cmp);
    fo(i,1,n) b[i]=q[a[i]].y;
    d[0]=2147483647;
    fo(i,1,n)
    {
        int l=0,r=t;
        while(l+1<r)
        {
            int mid=(l+r)/2;
            if(d[mid]>b[i]) l=mid;
            else r=mid;
        }
        int q=l;
        if(d[r]>b[i]) q=r;
        d[q+1]=b[i];
        if(q==t) t++;
    }
    cout<<t;
}
posted @ 2016-10-05 16:09  sadstone  阅读(29)  评论(0编辑  收藏  举报