洛谷 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.