洛谷 P1439 排列LCS问题

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

你可能感兴趣的:(单调序列,二分查找,洛谷)