level 5
why051115
楼主
矩阵(matrix)
时间限制:1Sec 内存限制128MB
【题目描述】
给定一个n*n的矩阵A,第i行第j列的值a[i,j]= i^2+100000 × i + j^2 - 100000 × j + i × j,求出矩阵中第m小的的值
【输入】
两个正整数n,m,表示矩阵大小和要找第m小的值
【输出】
一行,表示第m小的值
【样例输入1】
5 10
【样例输出1】
-99939
【样例输入2】
3 9
【样例输出2】
200013
【数据范围】
100%1<=n<=50000,1<=m<=n*n
【提示】
每一列的数都是从小到大单调递增的,用两个二分,一个二分枚举答案,一个二分用来验证答案是否正确。
为什么超时了?
var
n,i:longint;
m:int64;
f:boolean;
function cal(i,j:int64):int64;
begin
if i=0 then exit(-(1 shl 60));
exit(i*i+100000*i+j*j-100000*j+i*j);
end;
begin
assign(input,'matrix.in');reset(input);
assign(output,'matrix.out');rewrite(output);
readln(n,m);
f:=true;
for i:=1 to n do
if m-i>0 then m:=m-i else
begin
f:=false;
break;
end;
if not f then begin writeln(cal(m,n-i+m)); halt; end;
for i:=n-1 downto 1 do
if m-i>0 then m:=m-i else
begin
f:=false;
break;
end;
writeln(cal(n-i+m,m));
close(input);close(output);
end.
2017年07月28日 10点07分
1
时间限制:1Sec 内存限制128MB
【题目描述】
给定一个n*n的矩阵A,第i行第j列的值a[i,j]= i^2+100000 × i + j^2 - 100000 × j + i × j,求出矩阵中第m小的的值
【输入】
两个正整数n,m,表示矩阵大小和要找第m小的值
【输出】
一行,表示第m小的值
【样例输入1】
5 10
【样例输出1】
-99939
【样例输入2】
3 9
【样例输出2】
200013
【数据范围】
100%1<=n<=50000,1<=m<=n*n
【提示】
每一列的数都是从小到大单调递增的,用两个二分,一个二分枚举答案,一个二分用来验证答案是否正确。
为什么超时了?
var
n,i:longint;
m:int64;
f:boolean;
function cal(i,j:int64):int64;
begin
if i=0 then exit(-(1 shl 60));
exit(i*i+100000*i+j*j-100000*j+i*j);
end;
begin
assign(input,'matrix.in');reset(input);
assign(output,'matrix.out');rewrite(output);
readln(n,m);
f:=true;
for i:=1 to n do
if m-i>0 then m:=m-i else
begin
f:=false;
break;
end;
if not f then begin writeln(cal(m,n-i+m)); halt; end;
for i:=n-1 downto 1 do
if m-i>0 then m:=m-i else
begin
f:=false;
break;
end;
writeln(cal(n-i+m,m));
close(input);close(output);
end.
