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

本文介绍了一道算法题目,通过线段树优化实现高效求解。文章首先提出70分解决方案,随后升级到100分完整解法,并分享了比赛时的想法及细节优化。文中附带Pascal代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值