题目
Description
在麦克雷的面前有N个数,以及一个R*C的矩阵。现在他的任务是从N个数中取出R*C个,并填入这个矩阵中。矩阵每一行的法值为本行最大值与最小值的差,而整个矩阵的法值为每一行的法值的最大值。现在,麦克雷想知道矩阵的最小法值是多少。
Input
输入共两行。
第一行是三个整数:n,r,c。
第二行是 n 个整数 Pi。
Output
输出一个整数,即满足条件的最小的法值。
Sample Input
7 2 3
170 205 225 190 260 225 160
Sample Output
30
Data Constraint
30%:1<=n,r,c<=100
50%:1<=n,r,c<=1000
100%:1<=r,c<=10^4,r*c<=n<=5*10^5,0
比赛时の想法
先把所有的数排序一下,那么显然每一行都是这些数中连续的一段,那么我们就可以把每一种情况的法值都预处理一下,然后二分+dp就可以了
dp不详述了吧QAQ反正大家都A了~
var
a,b,f,g:array[0..500005]of longint;
i,j,k,l,n,m,r,c,x,rr,mid,ans:longint;
procedure qsort(l,r:longint);
var
i,j,mid:longint;
begin
i:=l;
j:=r;
mid:=a[(i+j) div 2];
repeat
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;
until i>j;
if i<r then qsort(i,r);
if l<j then qsort(l,j);
end;
begin
// assign(input,'t1.in'); reset(input);
readln(n,rr,c);
for i:=1 to n do read(a[i]);
readln;
qsort(1,n);
for i:=c to n do b[i-c+1]:=a[i]-a[i-c+1];
m:=n-c+1;
l:=0;
r:=a[n];
f[0]:=0;
g[0]:=0;
while l<r do
begin
mid:=(l+r) div 2;
for i:=1 to m do
begin
g[i]:=g[i-1];
if i-c>0 then f[i]:=g[i-c] else f[i]:=0;
if b[i]<=mid then
begin
inc(f[i]);
if f[i]>g[i] then g[i]:=f[i];
end;
end;
if g[m]>=rr then r:=mid else l:=mid+1;
end;
writeln(l);
// close(input);
end.