bzoj3244
2015-06-30 16:12
225 查看
很不幸,这题我又被虐了,给个链接http://www.cnblogs.com/g-word/p/3288675.html
View Code
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
相关文章推荐
- Winform下richtextbox截图实现
- 耦合与耦合性概念解释(一)
- iOS开发拓展篇—音频处理(音乐播放器4)
- function类中定义变量this的简单说明
- cocos2d-js环境配置以及创建(Win)
- php mongodb (一)—— CURD
- JavaWeb学习记录(四)——日期和数字的格式转换
- Linux RedHat6.2安装Redis-3.0.2小计
- 链栈
- 【Android】实现下载网络图片并保存到SD卡中
- CocoaPods进阶
- iOS开发拓展篇—音频处理(音乐播放器3)
- 对话框类的数据交换和检验
- JavaWeb学习记录(二)——防盗链技术
- JavaWeb学习记录(五)——Servlet随机产生验证码
- JSONObject与JSONArray的使用
- CListCtrl控件中显示进度条
- cstring 转 cstringarray 转 BYTE
- 黑马程序员 网络编程
- CocoaPods使用