| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
我也不知道是什么算法。。。瞎做的。。
program p3368;
type mytype=record
ans,f,b,len1,len2:longint;
end;
var e,w,i,lev,n,q:longint;
a:array[1..100000] of longint;
f:array[1..100000,0..18] of mytype;
function find(q:longint):longint;
begin
find:=-1;
while q>0 do begin
inc(find);
q:=q div 2;
end;
end;
function max(a,b:longint):longint;
begin
if a>b then exit(a)
else exit(b);
end;
function con(q,w:mytype):mytype;
begin
con.ans:=max(q.ans,w.ans);
if q.b=w.f then
con.ans:=max(con.ans,q.len2+w.len1);
con.f:=q.f;
con.b:=w.b;
if q.f=w.f then con.len1:=q.len1+w.len1
else con.len1:=q.len1;
if q.b=w.b then con.len2:=q.len2+w.len2
else con.len2:=w.len2;
end;
procedure que(q,w:longint);
var i,len,lev:longint;
ans:mytype;
begin
lev:=find(w);
len:=1;
for i:=1 to lev do
len:=len*2;
ans:=f[q,lev];
inc(q,len);
dec(w,len);
while w>0 do begin
dec(lev);
len:=len div 2;
if w>=len then begin
ans:=con(ans,f[q,lev]);
inc(q,len);
dec(w,len);
end;
end;
writeln(ans.ans);
end;
procedure prepare;
var i,j,len:longint;
begin
for i:=1 to n do begin
f[i,0].ans:=1;
f[i,0].f:=a[i];
f[i,0].b:=a[i];
f[i,0].len1:=1;
f[i,0].len2:=1;
end;
len:=1;
for i:=1 to lev do begin
len:=len*2;
for j:=1 to n-len+1 do
f[j,i]:=con(f[j,i-1],f[j+(len div 2),i-1]);
end;
end;
procedure init;
var i:longint;
begin
fillchar(a,sizeof(a),0);
for i:=1 to n do
read(a[i]);
end;
begin
repeat
read(n);
if n<>0 then begin
readln(q);
init;
lev:=find(n);
prepare;
for i:=1 to q do begin
readln(e,w);
que(e,w-e+1);
end;
end;
until n=0;
end.
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator