【NOIP2016提高A组五校联考1】道路规划

来源:互联网 发布:软件著作权zhongzhiip 编辑:程序博客网 时间:2024/06/16 20:36

题目

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.
0 0
原创粉丝点击