NDK 1365 yep的星星

7 篇文章 0 订阅
5 篇文章 0 订阅

问题描述:

 暗夜,渐渐布满天空,无数的星挣破夜幕探出来,夜的潮气在空气中漫漫地浸润,扩散出一  种感伤的氛围。孤独地仰望天空,星空格外澄净,悠远的星闪耀着,像细碎的泪花……忽  地,一声轮胎与地面的刺耳摩擦声划破了夜的宁静,刚刚考得驾照的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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值