问题描述: | 暗夜,渐渐布满天空,无数的星挣破夜幕探出来,夜的潮气在空气中漫漫地浸润,扩散出一 种感伤的氛围。孤独地仰望天空,星空格外澄净,悠远的星闪耀着,像细碎的泪花……忽 地,一声轮胎与地面的刺耳摩擦声划破了夜的宁静,刚刚考得驾照的yep带着群女来到了这 静谧地荒山野岭——来欣赏这美丽的星空。可是,问题随即而来…… 女A:yep,你说最左面的那7颗星中那个最大啊? yep:是第6个吧. 女B:那yep哥哥~哪个最小啊? yep:恩~第3个吧。 女C/D/E…Z…:那这边/那边的这几颗星中哪个最大/小啊? ……yep突然感到一阵眼晕。忽的它想到了你,在危难中它从不会忘记朋友。它借口离开拨 通了你的手机。 它依次告诉了你空中n个星星的大小,为防万一,请你依次求出每以k(k<n)颗星星为一组中 最大和最小的星星的大小是多少? | |
数据输入: | 第一行:n k 第二行有n个数,分别是星星的大小。星星大小-2147483648~2147483647范围内 | |
结果输出: | 第一行有(n-k+1)个数,分别是依次每k颗星星中最小的大小。 第二行有(n-k+1)个数,分别是依次每k颗星星中最大的大小。 | |
样例: | 10 6 2 -1 4 3 4 -1 5 6 7 8 | -1 -1 -1 -1 -1 4 5 6 7 8 |
核心思想: | Rmq问题,所以st、线段树什么的都能过,模拟都能拿70。 |
var
f1,f2:array[0..500000,0..20]of longint;
n,i,j,k,t:longint;
function max(a,b:longint):longint;
begin
ifa>b then exit(a);exit(b);
end;
function min(a,b:longint):longint;
begin
ifa<b then exit(a);exit(b);
end;
begin
assign(input,'yepstar.in');reset(input);
assign(output,'yepstar.out');rewrite(output);
readln(n,k);
fori:=1 to n do read(f1[i,0]);
f2:=f1;
t:=trunc(ln(n)/ln(2));
forj:=1 to t do
fori:=1 to n+1-1 shl j do
begin
f1[i,j]:=max(f1[i,j-1],f1[i+1 shl (j-1),j-1]);
f2[i,j]:=min(f2[i,j-1],f2[i+1 shl (j-1),j-1]);
end;
t:=trunc(ln(k)/ln(2));
fori:=1 to n-k+1 do
begin
write(min(f2[i,t],f2[i+k-1 shl t,t]),' ');
end;
writeln;
fori:=1 to n-k+1 do
begin
write(max(f1[i,t],f1[i+k-1 shl t,t]),' ');
end;
close(input);close(output);
end.
题目来源:NDK 1365