寻找
题目描述
在平面直角坐标系上有
N
个果实,每个果实都有一个对应的坐标,现在
1、
YYK
可以走到(
x
+
2、它可以走到(
3、她可以走到(
x
+
YYK
很贪心,她想拿尽量多的果实,但她又比较蠢,不知道她最多能拿多少个果实,于是她把这个问题交给了你。
数据范围
对于
100
%的数据
1
<=
其中(
Xi
,
Yi
)为第
i
个果实的坐标。
题解
首先,
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.