您的位置:首页 > 其它

1691: [Usaco2007 Dec]挑剔的美食家

2013-03-18 17:26 218 查看
var
nnn,root,xx,nn,n,m,i,j:longint;ans:int64;
l,r,size,a,an,bn,am,bm:array[1..100000]of longint;
function new(x:longint):longint;
begin
inc(nn);
size[nn]:=1;a[nn]:=x; exit(nn);
end;

procedure insert(var t,x:longint);
begin
if t=0 then
begin
t:=new(x);
exit;
end;
inc(size[t]);
if x<a[t] then insert(l[t],x)
else insert(r[t],x);
end;
function search(t,x:longint):longint;
begin
search:=0;
while t<>0 do
begin
if (a[t]<=x)and(a[t]>search) then
search:=a[t];
if x<a[t] then
t:=l[t]
else t:=r[t];
end;
end;
function delete(var t:longint; x:longint):longint;
var rr,k:longint;
begin
dec(size[t]);
if (x=a[t])or((x<a[t])and(l[t]=0))or((x>a[t])and(r[t]=0)) then
begin
rr:=a[t];
if (l[t]=0)or(r[t]=0) then
t:=l[t]+r[t]
else a[t]:=delete(l[t],a[t]+1);
exit(rr);
end
else if a[t]>x then exit(delete(l[t],x))
else exit(delete(r[t],x));
end;
procedure sort1(l,r: longint);
var
i,j,xx,yy: longint;
begin
i:=l;
j:=r;
xx:=an[(l+r) div 2];
repeat
while an[i]<xx do
inc(i);
while xx<an[j] do
dec(j);
if not(i>j) then
begin
yy:=an[i];
an[i]:=an[j];
an[j]:=yy;
yy:=bn[i];
bn[i]:=bn[j];
bn[j]:=yy;
inc(i);
j:=j-1;
end;
until i>j;
if l<j then
sort1(l,j);
if i<r then
sort1(i,r);
end;
procedure sort2(l,r: longint);
var
i,j,xx,yy: longint;
begin
i:=l;
j:=r;
xx:=am[(l+r) div 2];
repeat
while am[i]<xx do
inc(i);
while xx<am[j] do
dec(j);
if not(i>j) then
begin
yy:=am[i];
am[i]:=am[j];
am[j]:=yy;
yy:=bm[i];
bm[i]:=bm[j];
bm[j]:=yy;
inc(i);
j:=j-1;
end;
until i>j;
if l<j then
sort2(l,j);
if i<r then
sort2(i,r);
end;

begin
readln(n,m);
for i:=1 to n do
readln(an[i],bn[i]);
for i:=1 to m do
readln(am[i],bm[i]);
sort1(1,n);sort2(1,m);
j:=1;
for i:=1 to m do
begin
if nnn>n then break;
while (an[j]<=am[i])and(j<=n) do
begin
insert(root,bn[j]);
inc(j);
end;
xx:=search(root,bm[i]);
if xx<>0 then
begin
inc(nnn);
ans:=ans+am[i];
delete(root,xx);
end;
end;
writeln(ans);
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: