zoukankan      html  css  js  c++  java
  • pku3264 Balanced Lineup

    求区间最值之差,需要Qlogn的算法,可以用线段树或者ST。

    线段树1750ms

    View Code
     1 program pku3264_line_tree(input,output);
     2 type
     3    node    = record
     4          left,right,x,y,minx,maxx : longint;
     5       end;
     6 var
     7    tree    : array[0..500000] of node;
     8    n,q    : longint;
     9    a    : array[0..200000] of longint;
    10    tot    : longint;
    11 function min(aa,bb :longint ):longint;
    12 begin
    13    if aa<bb then
    14       exit(aa);
    15    exit(bb);
    16 end; { min }
    17 function max(aa,bb :longint ):longint;
    18 begin
    19    if aa>bb then
    20       exit(aa);
    21    exit(bb);
    22 end; { max }
    23 procedure build(xx,yy: longint );
    24 var
    25    mid,now : longint;
    26 begin
    27    inc(tot);
    28    tree[tot].x:=xx;
    29    tree[tot].y:=yy;
    30    if xx=yy then
    31    begin
    32       tree[tot].minx:=a[xx];
    33       tree[tot].maxx:=a[xx];
    34       exit;
    35    end;
    36    now:=tot;
    37    mid:=(xx+yy)>>1;
    38    tree[now].left:=tot+1;
    39    build(xx,mid);
    40    tree[now].right:=tot+1;
    41    build(mid+1,yy);
    42    tree[now].minx:=min(tree[tree[now].left].minx,tree[tree[now].right].minx);
    43    tree[now].maxx:=max(tree[tree[now].left].maxx,tree[tree[now].right].maxx);
    44 end; { build }
    45 procedure init;
    46 var
    47    i : longint;
    48 begin
    49    readln(n,q);
    50    for i:=1 to n do
    51       readln(a[i]);
    52    build(1,n);
    53 end; { init }
    54 function getmax(now,xx,yy :longint ):longint;
    55 var
    56    mid : longint;
    57 begin
    58    if (tree[now].x=xx)and(tree[now].y=yy) then
    59       exit(tree[now].maxx);
    60    mid:=(tree[now].x+tree[now].y)>>1;
    61    if yy<=mid then
    62       exit(getmax(tree[now].left,xx,yy))
    63    else
    64       if xx>mid then
    65      exit(getmax(tree[now].right,xx,yy))
    66       else
    67      exit(max(getmax(tree[now].left,xx,mid),getmax(tree[now].right,mid+1,yy)));
    68 end; { getmax }
    69 function getmin(now,xx,yy :longint ):longint;
    70 var
    71    mid : longint;
    72 begin
    73    if (tree[now].x=xx)and(tree[now].y=yy) then
    74       exit(tree[now].minx);
    75    mid:=(tree[now].x+tree[now].y)>>1;
    76    if yy<=mid then
    77       exit(getmin(tree[now].left,xx,yy))
    78    else
    79       if xx>mid then
    80      exit(getmin(tree[now].right,xx,yy))
    81       else
    82      exit(min(getmin(tree[now].left,xx,mid),getmin(tree[now].right,mid+1,yy)));
    83 end; { getmin }
    84 procedure solve();
    85 var
    86    i,xx,yy : longint;
    87 begin
    88    for i:=1 to q do
    89    begin
    90       readln(xx,yy);
    91       writeln(getmax(1,xx,yy)-getmin(1,xx,yy));
    92    end;
    93 end; { solve }
    94 begin
    95    init;
    96    solve;
    97 end.

    ST算法1204ms

    View Code
     1 program pku3264(input,output);
     2 var
     3    f,g : array[0..200001,0..18] of longint;
     4    n,q : longint;
     5 procedure init;
     6 var
     7    i : longint;
     8 begin
     9    readln(n,q);
    10    for i:=1 to n do
    11    begin
    12       readln(f[i,0]);
    13       g[i,0]:=f[i,0];
    14    end;
    15 end; { init }
    16 function min(aa,bb :longint ):longint;
    17 begin
    18    if aa<bb then
    19       exit(aa);
    20    exit(bb);
    21 end; { min }
    22 function max(aa,bb :longint ):longint;
    23 begin
    24    if aa>bb then
    25       exit(aa);
    26    exit(bb);
    27 end; { max }
    28 procedure main;
    29 var
    30    i,j : longint;
    31 begin
    32    for j:=1 to trunc(ln(n)/ln(2)) do
    33       for i:=1 to n do
    34      if i+1<<(j-1)>n then
    35         break
    36      else
    37      begin
    38         f[i,j]:=min(f[i,j-1],f[i+1<<(j-1),j-1]);
    39         g[i,j]:=max(g[i,j-1],g[i+1<<(j-1),j-1]);
    40      end;
    41 end; { main }
    42 procedure solve();
    43 var
    44    i,x,y,t : longint;
    45 begin
    46    for i:=1 to q do
    47    begin
    48       readln(x,y);
    49       t:=trunc(ln(y-x+1)/ln(2));
    50       writeln(max(g[x,t],g[y-1<<t+1,t])-min(f[x,t],f[y-1<<t+1,t]));
    51    end;
    52 end; { solve }
    53 begin
    54    init;
    55    main;
    56    solve;
    57 end.

    还是ST简洁啊,DP就是NB!

  • 相关阅读:
    js去除空格
    Quartz定时任务学习(九)Quartz监听器
    Quartz定时任务学习(七)Cron 触发器
    数据挖掘之聚类算法K-Means总结
    SQL SERVER分区具体例子详解
    基于basys2驱动LCDQC12864B的verilog设计图片显示
    图像处理的多线程计算
    三维空间中的几种坐标系
    2017年要学习的三个CSS新特性
    Mesos 资源分配
  • 原文地址:https://www.cnblogs.com/neverforget/p/2446794.html
Copyright © 2011-2022 走看看