题目大意:
给你两个序列,找出上面的比下面数字大的总和。
长度<20000
思路:
暴力o(n^2);
用排序一个序列+二分o(2n log n);
两个排序加上线性指针优化(2n log n+n);
后面两个方法都可以过得,我写了指针的
程序:
const
maxn=20005;
var
a,b:array [0..maxn] of longint;
i,j,n,m,ans:longint;
procedure qsort(l,r:longint);
var
i,j,mid:longint;
begin
i:=l; j:=r;
mid:=b[(l+r) div 2];
while i<j do
begin
while b[i]<mid do inc(i);
while b[j]>mid do dec(j);
if i<=j then
begin
b[0]:=b[i];
b[i]:=b[j];
b[j]:=b[0];
inc(i);
dec(j);
end;
end;
if i<r then qsort(i,r);
if j>l then qsort(l,j);
end;
procedure qsort1(l,r:longint);
var
i,j,mid:longint;
begin
i:=l; j:=r;
mid:=a[(l+r) div 2];
while i<j do
begin
while a[i]>mid do inc(i);
while a[j]<mid do dec(j);
if i<=j then
begin
a[0]:=a[i];
a[i]:=a[j];
a[j]:=a[0];
inc(i);
dec(j);
end;
end;
if l<j then qsort1(l,j);
if i<r then qsort1(i,r);
end;
begin
assign(input,'frient.in'); reset(input);
assign(output,'frient.out'); rewrite(output);
readln(n,m);
for i:=1 to n do
read(a[i]);
readln;
for i:=1 to m do
read(b[i]);
a[n+1]:=maxlongint;
qsort(1,m);
qsort1(1,n);
i:=0; j:=m;
b[0]:=-maxlongint;
while (i<n) do
begin
inc(i);
while a[i]<=b[j] do dec(j);
ans:=ans+j;
end;
writeln(ans);
close(input); close(output);
end.