洛谷 P1439 排列LCS问题

来源:互联网 发布:巴氏刷牙法 知乎 编辑:程序博客网 时间:2024/05/22 12:05

洛谷 P1439 排列LCS问题


题目

题目描述

给出1-n的两个排列P1和P2,求它们的最长公共子序列。

输入输出格式

输入格式:
第一行是一个数n,

接下来两行,每行为n个数,为自然数1-n的一个排列。

输出格式:
一个数,即最长公共子序列的长度

输入输出样例

输入样例#1:

5
3 2 1 4 5
1 2 3 4 5

输出样例#1:

3

说明

【数据规模】

对于50%的数据,n≤1000

对于100%的数据,n≤100000


题解

单调队列+二分查找


代码(Pascal)

var n,tot:longint;    x,y,q:array[0..100005]of longint; procedure init;  var i,j,turn:longint;   begin     readln(n);     for i:=1 to n do      begin        read(turn);        x[turn]:=i;       end;     for i:=1 to n do read(y[i]);    end; function find(x:longint):longint;  var l,r,mid:longint;   begin     l:=0;r:=tot;     while l<=r do      begin        mid:=(l+r) div 2;        if q[mid]<x then l:=mid+1                    else r:=mid-1;       end;     exit(l);    end; procedure main;  var i,p:longint;   begin     tot:=0;     fillchar(q,sizeof(q),0);     for i:=1 to n do      begin        p:=find(x[y[i]]);        if p>tot then begin                       inc(tot);                       q[tot]:=x[y[i]];                      end                 else q[p]:=x[y[i]];       end;    end; procedure print;  begin    write(tot);   end; begin   init;   main;   print; end.
原创粉丝点击