您的位置:首页 > 其它

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

2016-11-04 19:25 381 查看

寻找

题目描述

在平面直角坐标系上有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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: