BZOJ1481 : Navigation Game
设$f[i][j][k]$表示从最后一行某个$H$走到$(i,j)$且在第$i$行只经过了$(i,j)$,途中经过了$k$次$F$的最小代价。
$A[i][j][k]$表示从下一行$\leq i$的某个$f[old][x][j]$且前$x-1$个有$k$个$F$的位置走过来的最小代价。
$B[i][j][k]$表示从下一行$\geq i$的某个$f[old][x][j]$且前$x$个有$k$个$F$的位置走过来的最小代价。
$A$和$B$的转移都具有决策单调性,分治求解即可。然后用$A$和$B$计算当前行的$f$。
时间复杂度$O(nm\log m)$。
#include<cstdio>
const int N=1010,inf=~0U>>1;
int n,m,M,i,j,k,x,y,f[N][N][2],v[N][N],ans=inf;
int A[N][2][2],B[N][2][2],g[N][2],so[N],sf[N],s1[N],s2[N];
char a[N][N];
inline void up(int&x,int y){if(x>y)x=y;}
void getA(int l,int r,int dl,int dr){
int m=(l+r)>>1,dm=m,&ret=A[m][x][y];
if(dm<dl)dm=dl;
if(dm>dr)dm=dr;
ret=inf;
for(int i=dl;i<=dr&&i<=m;i++){
if(g[i][x]==inf||sf[i-1]!=y||so[m]>so[i-1])continue;
int t=g[i][x]+s1[m]-s1[i-1]-(s2[m]-s2[i-1])*i;
if(t<ret)ret=t,dm=i;
}
if(l<m)getA(l,m-1,dl,dm);
if(r>m)getA(m+1,r,dm,dr);
}
void getB(int l,int r,int dl,int dr){
int m=(l+r)>>1,dm=m,&ret=B[m][x][y];
if(dm<dl)dm=dl;
if(dm>dr)dm=dr;
ret=inf;
for(int i=dr;i>=dl&&i>=m;i--){
if(g[i][x]==inf||sf[i]!=y||so[i]>so[m-1])continue;
int t=g[i][x]-s1[i]+s1[m-1]+(s2[i]-s2[m-1])*i;
if(t<ret)ret=t,dm=i;
}
if(l<m)getB(l,m-1,dl,dm);
if(r>m)getB(m+1,r,dm,dr);
}
int main(){
scanf("%d%d",&n,&m);M=m;
for(i=1;i<=n;i++)scanf("%s",a[i]+1);
for(j=1;j<=m;j++){
if(a[1][j]=='.')a[1][j]='O';
if(a[n][j]=='.')a[n][j]='O';
}
for(i=1;i<=n;i++)for(j=1;j<=m;j++){
v[i][j]=1;
if(a[i][j]=='B')v[i][j]=0;
if(a[i][j]=='S')v[i][j]=2;
}
for(i=1;i<=n;i++)for(j=1;j<=m;j++)for(k=0;k<2;k++)f[i][j][k]=inf;
for(j=1;j<=m;j++)if(a[n][j]=='H')f[n][j][0]=0;
for(i=n-1;i;i--){
for(j=1;j<=m;j++){
so[j]=so[j-1]+(a[i+1][j]=='O');
sf[j]=sf[j-1]^(a[i+1][j]=='F');
s1[j]=s1[j-1]+j*v[i+1][j];
s2[j]=s2[j-1]+v[i+1][j];
for(k=0;k<2;k++)g[j][k]=f[i+1][j][k];
}
for(x=0;x<2;x++)for(y=0;y<2;y++)getA(1,m,1,m);
for(x=0;x<2;x++)for(y=0;y<2;y++)getB(1,m,1,m);
for(j=1;j<=m;j++)if(a[i][j]!='O')for(x=0;x<2;x++)for(y=0;y<2;y++){
up(f[i][j][x^y^sf[j]],A[j][x][y]);
up(f[i][j][x^y^sf[j-1]],B[j][x][y]);
}
for(j=1;j<=m;j++)for(k=0;k<2;k++)if(f[i][j][k]<inf)f[i][j][k]+=v[i][j];
}
for(j=1;j<=m;j++)up(ans,f[1][j][1]);
if(ans<inf)printf("%d",ans);else puts("Victory of Darkness");
return 0;
}
BZOJ1481 : Navigation Game的更多相关文章
- arcgis api for js共享干货系列之二自定义Navigation控件样式风格
arcgis api for js默认的Navigation控件样式风格如下图: 这样的风格不能说不好,各有各的爱好,审美观,这里也不是重点,这里的重点是如何自定义一套自己喜欢的样式风格呢:自己自定义 ...
- The Safe Navigation Operator (&.) in Ruby
The most interesting addition to Ruby 2.3.0 is the Safe Navigation Operator(&.). A similar opera ...
- Unity3D 导航网格自动寻路(Navigation Mesh)
NavMesh(导航网格)是3D游戏世界中用于实现动态物体自动寻路的一种技术,将游戏中复杂的结构组织关系简化为带有一定信息的网格,在这些网格的基础上通过一系列的计算来实现自动寻路..导航时,只需要给导 ...
- ABP理论学习之导航(Navigation)
返回总目录 本篇目录 创建菜单 注册导航提供者 展示菜单 每一个web应用在页面之间都有一些要导航的菜单.ABP提供了公用的基础设施来创建菜单并将菜单展示给用户. 创建菜单 一个应用可能由不同的模块组 ...
- Sharepoint学习笔记—ECM系列—文档列表的Metedata Navigation与Key Filter功能的实现
如果一个文档列表中存放了成百上千的文档,想要快速的找到你想要的还真不是件容易的事,Sharepoint提供了Metedata Navigation与Key Filter功能可以帮助我们快速的过滤和定位 ...
- iOS第八课——Navigation Controller和Tab bar Controller
今天我们要学习Navigation Controller和Tab bar Controller. Navigation Controller是iOS编程中比较常用的一种容器,用来管理多个视图控制器. ...
- navigation和tabbar上的文字.图片 自定义
[[UITabBarItem appearance] setTitleTextAttributes:@{ UITextAttributeTextColor : [UIColor blackColor] ...
- navigation controller
一.程序框架 1.程序结构
- Xcode6 storyboard new push segue 后的视图控制器没有navigation item bug.
手动切一下 老的push,再切回来,就会出有了,我想是一个bug. Xcode 6 Segue with UINavigationItem up vote0down votefavorite I' ...
随机推荐
- XMPP框架下微信项目总结(2)授权登陆/注销/注册/打印日志
xmpp授权登陆步骤1 初始化xmppstream 连接服务器 传递属性jid(IP地址 端口号)2 连接成功后 传递“登”陆密码授权 3 授权后,发送在线消息xmpp所有的代理都是子线程中调用的,处 ...
- ShareSdk使用心得
1. 微信和朋友圈:分享的时候设置了链接和图片,但就是不显示: 需要指明ShareType为WEB_PAGE 2. 需要完整添加 ShareSdk 的所需要的权限,不然分享闪退,并且不报异常:网络请求 ...
- C语言字母频率统计
在进行密码破解时有时候需要得到字母出现的频率信息,下面我将简单的使用C语言来读取一个文件,然后统计该文件内的字母出现的频率. 1.在D盘下新建一个文本文件(文件名为"A.txt") ...
- hdu1018(数位)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1018 题意:求n!的数位(即n!有多少位): 思路:对于一个数x,它的数位ans=log10(x): ...
- NYOJ题目839合并
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAskAAAKgCAIAAADmrHcoAAAgAElEQVR4nO3dO1LsOheG4X8S5AyE2A
- candence 笔记总结
1.解决candece 启动后提示找不到licence文件的错误: candece的安装就不说了,按照破解步骤一步一步来就行了,但是装完后发现每次启动都会报错 "OrCAD Capture ...
- elk深度解析
上面的两张图是elk的一个架构 下面是对logstash分析:如下图 可以看出 logstash的一个角色shipper,(是通过配置文件来决定logstash是shipper还是indexer)注意 ...
- .NET开发工具之Excel导出公共类
来源:Pino晨 链接:cnblogs.com/chenxygx/p/5954870.html 说明 最近接了一个任务,就是做一个列表的Excel导出功能.并且有很多页面都会使用这个功能. 导出的Ex ...
- C# virtual override 和 new 的区别
一直以来我都对 virtual override 和 new 之间的区别感到疑惑不解. 特别笔试的时候特别容易考到,真的很容易弄错啊,畜生! 光看理论永远记不住,那不如写几行代码就懂了. 首先看看v ...
- 讲解JS的promise,这篇是专业认真的!
http://www.zhangxinxu.com/wordpress/2014/02/es6-javascript-promise-%E6%84%9F%E6%80%A7%E8%AE%A4%E7%9F ...