洛谷 P1439 排列LCS問題

2021-08-01 14:31:11 字數 1390 閱讀 5064

題目描述

給出1-n的兩個排列p1和p2,求它們的最長公共子串行。

輸入輸出格式

輸入格式:

第一行是乙個數n,

接下來兩行,每行為n個數,為自然數1-n的乙個排列。

輸出格式:

乙個數,即最長公共子串行的長度

輸入輸出樣例

輸入樣例#1:

5 3 2 1 4 5

1 2 3 4 5

輸出樣例#1:

說明【資料規模】

對於50%的資料,n≤1000

對於100%的資料,n≤100000

單調佇列+二分查詢

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]];

endelse q[p]:=x[y[i]];

end;

end;

procedure

print;

begin

write(tot);

end;

begin

init;

main;

print;

end.

xjb 洛谷 P1439 排列LCS問題

這個一看就是n n的暴力嘛,但是n有點大 因為是兩個排列,換句話說沒有重複的數字 那我們可以轉化一下 比如樣例 5 3 2 1 4 5 1 2 3 4 5 我們把下面一行的值變成上面一行的位置 3 2 1 4 5 那麼直接最長上公升子串行就好了 為什麼呢?比如第二行第乙個數1 如果我們選了1,那麼後...

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

最長公共子串行問題(LCS) 洛谷 P1439

題目 p1439 模板 最長公共子串行 洛谷 電腦科學教育新生態 luogu.com.cn 關於lcs問題,可以通過離散化轉換為lis問題,於是就可以使用stl二分的方法o nlogn 解決lcs問題!先將a陣列與乙個遞增的數列1,2,3.n兩兩對應 t陣列 再把b陣列中每個數在a陣列中的位置表示成...