JZOJ 4845 【NOIP2016提高A组集训第5场11.2】寻找

寻找

题目描述

在平面直角坐标系上有 N 个果实,每个果实都有一个对应的坐标,现在YYK从原点( 0 ,0)出发,由于 YYK 是一种很奇怪的生物,所以的运动方式只有三种(假设当前 YYK 在( x ,y))
1、 YYK 可以走到( x +1, y )
2、可以走到(x, y +1)
3、可以走到( x +1, y +1)
YYK 很贪心,想拿尽量多的果实,但又比较蠢,不知道最多能拿多少个果实,于是把这个问题交给了你。

数据范围

对于 100 %的数据 1 <=N<= 105 ,- 109 <= Xi , Yi <= 109
其中( Xi , Yi )为第 i 个果实的坐标。

题解

首先,YYK走过的路径一定是一条横纵坐标都递增的路径,于是我们可以按照果实的横坐标排序,按照纵坐标的大小求一次最长不下降子序列的长度即可。

Code(Pascal)

var
    n,m,j,k,i,o,le,ri,longest,ans,mid:longint;
    f,len:array[-1..100200] of int64;
    zb:array[0..100200,1..2] of int64;
function max(a,b:int64):int64;
    begin
        if a>b then exit(a)
        else exit(b);
    end;
procedure qsort(l,r:longint);
     var
         i,j,m,mm:longint;
     begin
         i:=l;
         j:=r;
         m:=zb[(l+r) div 2,1];
         mm:=zb[(l+r) div 2,2];
         repeat
             while (zb[i,1]<m) or (zb[i,1]=m) and (zb[i,2]<mm) do inc(i);
             while (zb[j,1]>m) or (zb[j,1]=m) and (zb[j,2]>mm) do dec(j);
             if i<=j then
             begin
                 zb[0]:=zb[i];
                 zb[i]:=zb[j];
                 zb[j]:=zb[0];
                 inc(i);
                 dec(j);
             end;
         until i>j;
         if l<j then qsort(l,j);
         if i<r then qsort(i,r);
     end;
begin
    readln(n);
    for i:=1 to n do
    readln(zb[i,1],zb[i,2]);
    qsort(1,n);
    zb[n+1,1]:=1;
    for j:=1 to n+1 do
    if (zb[j,1]>=0) and (zb[j,2]>=0) then break;
    f[j]:=1;
    longest:=1;
    len[1]:=zb[j,2];
    len[0]:=0;
    len[-1]:=-1000000001;
    ans:=1;
    for i:=j+1 to n do
    begin
        le:=-1;
        ri:=longest+1;
        while le+1<ri do
        begin
            mid:=(le+ri) div 2;
            if len[mid]<=zb[i,2] then le:=mid
            else ri:=mid;
        end;
        f[i]:=le+1;
        if le=longest then inc(longest);
        if f[i]<>0 then
        len[le+1]:=zb[i,2];
        ans:=max(ans,f[i]);
    end;
    writeln(ans);
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值