bawang51吧 关注:31贴子:3,169
  • 6回复贴,共1

【OI】RMQ_ST

只看楼主收藏回复

var f:array[1..100,0..100]of longint;
i,n,m,x,y,k:longint;
function max(a,b:longint):longint;
begin
if a>b then
exit(a);
exit(b);
end;
procedure happy;
var i,j:longint;
begin
for j:=1 to trunc(ln(n)/ln(2)) do
for i:=1 to n do
f[i,j]:=max(f[i,j-1],f[i+2*(j-1),j-1]);
end;
begin
readln(n,m);
for i:=1 to n do
readln(f[i,0]);
happy;
for i:=1 to m do
begin
readln(x,y);
k:=trunc(ln(y-x+1)/ln(2));
writeln(max(f[x,k],f[y-1 shl k+1,k]));
end;
end.


IP属地:上海1楼2011-11-02 19:47回复
    以上为最大值,一会儿写最小值


    IP属地:上海2楼2011-11-02 19:48
    回复
      2025-05-14 04:35:52
      广告
      最小值
      var f:array[1..100,0..100]of longint;
      i,n,m,x,y,k,j:longint;
      function min(a,b:longint):longint;
      begin
      if a<b then
      exit(a);
      exit(b);
      end;
      procedure happy;
      var i,j:longint;
      begin
      for j:=1 to trunc(ln(n)/ln(2)) do
      for i:=1 to n do
      f[i,j]:=min(f[i,j-1],f[i+1 shl (j-1),j-1]);
      end;
      begin
      readln(n,m);
      fillchar(f,sizeof(f),127);
      for i:=1 to n do
      readln(f[i,0]);
      happy;
      for i:=1 to m do
      begin
      readln(x,y);
      k:=trunc(ln(y-x+1)/ln(2));
      writeln(f[x,k],' ',f[y-1 shl k+1,k]);
      writeln(min(f[x,k],f[y-1 shl k+1,k]));
      end;
      end.


      IP属地:上海3楼2011-11-02 20:09
      回复
        以上全是渣渣
        重发


        IP属地:上海4楼2011-11-02 20:11
        回复
          var f:array[1..100,0..100]of longint;
          i,n,m,x,y,k,j:longint;
          function max(a,b:longint):longint;
          begin
          if a>b then
          exit(a);
          exit(b);
          end;
          procedure happy;
          var i,j:longint;
          begin
          for j:=1 to trunc(ln(n)/ln(2)) do
          for i:=1 to n do
          f[i,j]:=max(f[i,j-1],f[i+1 shl (j-1),j-1]);
          end;
          begin
          readln(n,m);
          for i:=1 to n do
          readln(f[i,0]);
          happy;
          for i:=1 to m do
          begin
          readln(x,y);
          k:=trunc(ln(y-x+1)/ln(2));
          writeln(max(f[x,k],f[y-1 shl k+1,k]));
          end;
          end.


          IP属地:上海5楼2011-11-02 20:12
          回复
            var f:array[1..100,0..100]of longint;
            i,n,m,x,y,k,j:longint;
            function min(a,b:longint):longint;
            begin
            if a<b then
            exit(a);
            exit(b);
            end;
            procedure happy;
            var i,j:longint;
            begin
            for j:=1 to trunc(ln(n)/ln(2)) do
            for i:=1 to n do
            f[i,j]:=min(f[i,j-1],f[i+1 shl (j-1),j-1]);
            end;
            begin
            readln(n,m);
            fillchar(f,sizeof(f),127);
            for i:=1 to n do
            readln(f[i,0]);
            happy;
            for i:=1 to m do
            begin
            readln(x,y);
            k:=trunc(ln(y-x+1)/ln(2));
            writeln(min(f[x,k],f[y-1 shl k+1,k]));
            end;
            end.


            IP属地:上海6楼2011-11-02 20:13
            回复
              procedure rmq;
              var
              i,j,max:longint;
              begin
              max:=trunc(ln(n)/ln(2));
              for i:=0 to n do st[i,0]:=i;
              for i:=1 to max do
              for j:=0 to n-(1 shl i)+1 do
              begin
              if sum[st[j,i-1]]<sum[st[j+(1 shl (i-1)),i-1]] then st[j,i]:=st[j,i-1]
              else st[j,i]:=st[j+(1 shl (i-1)),i-1];
              end;
              end;
              rmq的神用法
              sum里面是前缀和
              不解释
              


              IP属地:上海7楼2012-05-11 23:52
              回复