[LIS][树状数组]JZOJ 4810 道路规划

Description

 

Input

Output

 

Sample Input

5
1 4 5 2 3
3 4 2 1 5

Sample Output

3
 

Data Constraint


 

Hint

分析

把每个数在上面的位置映射到下面,样例就是:

5 2 4 1 3

那么显然上面位置与下面位置相逆的是合法方案,所以可以倒着求最长上升子序列

 

#include <iostream>
#include <cstdio>
#define lowbit(x) x&-x
using namespace std;
const int N=1e5+10;
int n;
int a[N],b[N],t[N],mlen;

void Add(int x,int k) {
    for (;x<=n;x+=lowbit(x)) t[x]=max(t[x],k);
}

int Query(int x) {
    int ans=0;
    for (;x;x-=lowbit(x)) ans=max(ans,t[x]);
    return ans;
}

int main() {
    scanf("%d",&n);
    for (int i=1,A;i<=n;i++) scanf("%d",&A),a[A]=i;
    for (int i=1;i<=n;i++) scanf("%d",&b[i]),b[i]=a[b[i]];
    for (int i=n;i;i--) {
        int q;
        mlen=max(q=Query(b[i])+1,mlen);
        Add(b[i],q);
    }
    printf("%d",mlen);
}
View Code

 

posted @ 2019-07-04 07:56  Vagari  阅读(200)  评论(0编辑  收藏  举报