【题意】
给定一段长度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.