您的位置:首页 > 其它

bzoj3244

2015-06-30 16:12 225 查看
很不幸,这题我又被虐了,给个链接http://www.cnblogs.com/g-word/p/3288675.html

var p:array[0..20] of longint;
f:array[0..200010,0..20] of longint;
mx,b,d,v:array[0..200010] of longint;
i,j,n,k:longint;
ans,s:double;

function min(a,b:longint):longint;
begin
if a>b then exit(b) else exit(a);
end;

function ask(l,r:longint):longint;
begin
k:=trunc(ln(r-l+1)/ln(2)+0.0001);
exit(min(f[l,k],f[r-p[k]+1,k]));
end;

begin
readln(n);
for i:=1 to n do
read(d[i]);
for i:=1 to n do
begin
read(b[i]);
v[b[i]]:=i;
end;
for i:=1 to n do
d[i]:=v[d[i]];
for i:=1 to n do
begin
v[d[i]]:=i;
if mx[i-1]>d[i] then mx[i]:=mx[i-1] else mx[i]:=d[i];
f[i,0]:=d[i];
end;
k:=trunc(ln(n)/ln(2)+0.1);
p[0]:=1;
for i:=1 to k do
p[i]:=p[i-1]*2;
for j:=1 to k do
for i:=1 to n do
if i+p[j]-1<=n then
f[i,j]:=min(f[i,j-1],f[i+p[j-1],j-1])
else break;
ans:=1;
for i:=1 to n-1 do
if (i=1) or (v[i]>v[i+1]) then ans:=ans+1+s
else if (v[i+1]=v[i]+1) and (mx[v[i]]<=i+1) then s:=s+0.5
else if ask(v[i],v[i+1])<i then s:=0;
ans:=ans+s;
writeln(ans-0.001:0:3);
writeln(ans:0:3);
writeln(ans+0.001:0:3);
end.


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: