Nguồn đề bài: http://vn.spoj.com/problems/SPSEQ/
1. Đề bài SPSEQ spoj
W. là 1 dãy các số nguyên dương. Nó có các đặc điểm sau:
– Độ dài của dãy là 1 số lẻ: L = 2*N + 1
– N + 1 số nguyên đầu tiên của dãy tạo thành 1 dãy tăng
– N + 1 số nguyên cuối của dãy tạo thành 1 dãy giảm
– Không có 2 số nguyên nào cạnh nhau trong dãy có giá trị bằng nhau
Ví dụ: 1, 2, 3, 4, 5, 4, 3, 2, 1 là 1 dãy W. độ dài 9. Tuy nhiên, dãy 1, 2, 3, 4, 5, 4, 3, 2, 2 không là 1 dãy W.
Yêu cầu: Trong các dãy con của dãy số cho trước, tìm dãy W. có độ dài dài nhất.
Input
Dòng 1: số nguyên dương N (N <= 100000), độ dài dãy số.
Dòng 2: N số nguyên dương ai (ai <= 109).
Output
1 số nguyên dương duy nhất là độ dài dãy W. dài nhất.
Example
Input:
10
1 2 3 4 5 4 3 2 1 10
Output:
9
Input:
19
1 2 3 2 1 2 3 4 3 2 1 5 4 1 2 3 2 2 1
Output:
9
2. hướng dẫn SPSEQ spoj
3. code tham khảo SPSEQ spoj
const fi= '';
maxd= 100009;
type data=longint;
var a,kq1,kq2: array[0..maxd] of longint;
l: array[0..maxd] of longint;
n: longint;
d: longint;
procedure nhap;
var i:longint;
f:text;
begin
assign(f,fi); reset(f);
readln(f,n);
for i:=1 to n do
read(f,a[i]);
close(f);
end;
function min(a,b:data):data;
begin
if a<b then exit(a);
exit(b);
end;
function max(a,b:data):data;
begin
if a>b then exit(a);
exit(b);
end;
procedure swap(var a,b:data);
var z:data;
begin
z:=a;
a:=b;
b:=z;
end;
procedure xuli;
var i,k,dau,cuoi,res:longint;
begin
l[1]:=1;d:=1;
kq1[1]:=1;
for i:=2 to n do
begin
if a[i]>a[l[d]] then
begin
inc(d);
l[d]:=i;
kq1[i]:=d;
end
else
begin
dau:=1;
cuoi:=d;
while dau<cuoi do
begin
k:=(dau+cuoi) div 2;
if a[l[k]]<a[i] then
dau:=k+1
else
cuoi:=k;
end;
l[dau]:=i;
kq1[i]:=dau;
end;
end;
for i:=1 to n div 2 do
swap(a[i],a[n-i+1]);
l[1]:=1;d:=1;
kq2[1]:=1;
for i:=2 to n do
begin
if a[i]>a[l[d]] then
begin
inc(d);
l[d]:=i;
kq2[i]:=d;
end
else
begin
dau:=1;
cuoi:=d;
while dau<cuoi do
begin
k:=(dau+cuoi) div 2;
if a[l[k]]<a[i] then
dau:=k+1
else
cuoi:=k;
end;
l[dau]:=i;
kq2[i]:=dau;
end;
end;
res:=0;
for i:=1 to n do
res:=max(res,2*min(kq1[i],kq2[n-i+1])-1);
writeln(res);
end;
begin
nhap;
xuli;
end.