【NOIP提高组五校联考】道路规划

Description

这里写图片描述

Solution

很显然可以把题目转换为相连点的位置作为编号,把两个点投影到坐标轴上能够发现,相交的边在投影出的区间一定是相交的。因为要求的是集合内的每一条边都两两相交,所以满足条件的一定是一个区间被另一个大一点的区间完全包含。容易想到,左端点顺序排序后,右端点做最长下降子序列,最长长度即为答案。

Code

var
    a,b,f:array[0..100000] of longint;
    n,i,sum,wz,x:longint;
function max(x,y:longint):longint;
begin
    if x>y then exit(x) else exit(y);
end;
procedure qsort(l,r:longint);
var i,j,mid:longint;
begin
    i:=l;j:=r;
    mid:=a[(i+j)div 2];
    repeat
        while a[i]<mid do inc(i);
        while mid<a[j] do dec(j);
        if i<=j then
        begin
            a[0]:=a[i];a[i]:=a[j];a[j]:=a[0];
            b[0]:=b[i];b[i]:=b[j];b[j]:=b[0];
            inc(i); dec(j);
        end;
    until i>j;
    if i<r then qsort(i,r);
    if l<j then qsort(l,j);
end;
function get(l,r,x:longint):longint;
var mid:longint;
begin
    get:=0;
    while l<r do
    begin
        mid:=(l+r)div 2;
        if f[mid]>x then
        begin
            get:=mid;
            l:=mid+1;
        end else r:=mid-1;
    end;
    if f[l]>x then get:=l;
    exit(get);
end;
begin
    readln(n);
    for i:=1 to n do read(a[i]);
    for i:=1 to n do
    begin
        read(b[i]);
        f[b[i]]:=i;
    end;
    for i:=1 to n do
    begin
        b[i]:=f[a[i]];
        a[i]:=i;
    end;
    fillchar(f,sizeof(f),0);
    qsort(1,n);
    sum:=1;
    f[1]:=b[1];
    for i:=2 to n do
    begin
        wz:=get(1,sum,b[i]);
        inc(wz);
        f[wz]:=max(f[wz],b[i]);
        if wz>sum then sum:=wz;
    end;
    writeln(sum);
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值