现在的位置: 首页 > 综合 > 正文

poj3368

2018年04月26日 ⁄ 综合 ⁄ 共 1237字 ⁄ 字号 评论关闭

【题意】

给定一段长度N不减数字序列,询问M次某一段之间最多出现相同的数字多少个

【输入】

多组数据

第一行两个数字n,m(均小于100000)

每组数据第一行为n个数字表示序列

接下来m行每行为两个数字l,r表示询问

数据以单独一行的一个0结束

【输出】

对于每组数据的每次询问,输出一个数字表示该段中最多出现相同的数字多少个

ST算法,我看的是discuss中的解析……

需要注意的k=trunc(ln(b-a+1)/ln(2))

program poj3368;
var
  n,m,i,j,k,tot,a,b,ans:longint;
  p,belong,pos,long:array [0..100001] of longint;
  max:array [0..18,0..100001] of longint;

function similar (a,b:longint):longint;
var
  k:longint;
begin
  if a=b then exit(long[a]);
  k:=trunc(ln(b-a+1)/ln(2));
  if max[k,a]>max[k,b-(1 shl k)+1] then exit(max[k,a])
                                   else exit(max[k,b-(1 shl k)+1]);
end;

begin
  repeat
    read(n);
    if n=0 then break;
    read(m);
    for i:=1 to n do
      read(p[i]);
    k:=p[1];
    tot:=1;
    fillchar(long,sizeof(long),0);
    for i:=1 to n do
      begin
        if p[i]<>k then
          begin
            k:=p[i];
            inc(tot);
          end;
        belong[i]:=tot;
        inc(long[tot]);
        pos[i]:=long[tot];
      end;
    for i:=1 to tot do
      max[0,i]:=long[i];
    k:=0;
    while 1 shl k < tot do
      begin
        for i:=1 to tot do
          if i+(1 shl k)>tot then max[k+1,i]:=max[k,i]
                           else
          if max[k,i]>max[k,i+(1 shl k)] then max[k+1,i]:=max[k,i]
                                         else max[k+1,i]:=max[k,i+(1 shl k)];
        inc(k);
      end;
    for i:=1 to m do
      begin
        read(a,b);
        if belong[a]=belong[b] then
          begin
            writeln(b-a+1);
            continue;
          end;
        if long[belong[a]]-pos[a]+1>pos[b] then ans:=long[belong[a]]-pos[a]+1
                                           else ans:=pos[b];
        if belong[a]+1<=belong[b]-1 then k:=similar(belong[a]+1,belong[b]-1)
                                    else k:=0;
        if k>ans then ans:=k;
        writeln(ans);
      end;
  until false;
end.


【上篇】
【下篇】

抱歉!评论已关闭.