题目
Description
Input
Sample Input
5
1 4 5 2 3
3 4 2 1 5
Output
Sample Output
3
Data Constraint
Hint
比赛时の想法
一开始想到了70分的,然后很快发现线段树的优化,结果一个细节挂掉QAQ
正解
首先70分的话就是一个f[i]表示上面的位置最后一个为i的时候可以选的最大的集合,显然在下面的值相同的那个点一定是在最右边的,那么直接n2即可
然后100分的话就是拿线段树,那么就可以用log的时间来求出每一个f[i]的值
贴代码
var
tree:array[0..500005]of longint;
a,b:array[0..100005]of longint;
i,j,k,l,n,x,y,ans,xx,xxx:longint;
function max(x,y:longint):longint;
begin
if x>y then exit(x) else exit(y);
end;
procedure change(v,l,r,x:longint);
var
mid:longint;
begin
if l=r then tree[v]:=y else
begin
mid:=(l+r) div 2;
if x<=mid then change(v*2,l,mid,x) else change(v*2+1,mid+1,r,x);
tree[v]:=max(tree[v*2],tree[v*2+1]);
end;
end;
procedure find(v,l,r,x,y:longint);
var
mid:longint;
begin
if (l=x) and (r=y) then xx:=max(xx,tree[v]) else
begin
mid:=(l+r) div 2;
if x>mid then find(v*2+1,mid+1,r,x,y) else
if y<=mid then find(v*2,l,mid,x,y) else
begin
find(v*2,l,mid,x,mid);
find(v*2+1,mid+1,r,mid+1,y);
end;
end;
end;
begin
assign(input,'t2.in'); reset(input);
readln(n);
for i:=1 to n do read(a[i]);
readln;
for i:=1 to n do
begin
read(x);
b[x]:=i;
end;
for i:=1 to n do
begin
xx:=0;
find(1,1,n,b[a[i]],n);
y:=xx+1;
if y>ans then ans:=y;
change(1,1,n,b[a[i]]);
end;
writeln(ans);
close(input);
end.