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

来源:互联网 发布:电脑无法上淘宝网 编辑:程序博客网 时间:2024/05/23 13:30

寻找

题目描述

在平面直角坐标系上有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.
2 0
原创粉丝点击