设$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的更多相关文章

  1. arcgis api for js共享干货系列之二自定义Navigation控件样式风格

    arcgis api for js默认的Navigation控件样式风格如下图: 这样的风格不能说不好,各有各的爱好,审美观,这里也不是重点,这里的重点是如何自定义一套自己喜欢的样式风格呢:自己自定义 ...

  2. The Safe Navigation Operator (&.) in Ruby

    The most interesting addition to Ruby 2.3.0 is the Safe Navigation Operator(&.). A similar opera ...

  3. Unity3D 导航网格自动寻路(Navigation Mesh)

    NavMesh(导航网格)是3D游戏世界中用于实现动态物体自动寻路的一种技术,将游戏中复杂的结构组织关系简化为带有一定信息的网格,在这些网格的基础上通过一系列的计算来实现自动寻路..导航时,只需要给导 ...

  4. ABP理论学习之导航(Navigation)

    返回总目录 本篇目录 创建菜单 注册导航提供者 展示菜单 每一个web应用在页面之间都有一些要导航的菜单.ABP提供了公用的基础设施来创建菜单并将菜单展示给用户. 创建菜单 一个应用可能由不同的模块组 ...

  5. Sharepoint学习笔记—ECM系列—文档列表的Metedata Navigation与Key Filter功能的实现

    如果一个文档列表中存放了成百上千的文档,想要快速的找到你想要的还真不是件容易的事,Sharepoint提供了Metedata Navigation与Key Filter功能可以帮助我们快速的过滤和定位 ...

  6. iOS第八课——Navigation Controller和Tab bar Controller

    今天我们要学习Navigation Controller和Tab bar Controller. Navigation Controller是iOS编程中比较常用的一种容器,用来管理多个视图控制器. ...

  7. navigation和tabbar上的文字.图片 自定义

    [[UITabBarItem appearance] setTitleTextAttributes:@{ UITextAttributeTextColor : [UIColor blackColor] ...

  8. navigation controller

    一.程序框架 1.程序结构

  9. Xcode6 storyboard new push segue 后的视图控制器没有navigation item bug.

    手动切一下 老的push,再切回来,就会出有了,我想是一个bug. Xcode 6 Segue with UINavigationItem up vote0down votefavorite   I' ...

随机推荐

  1. 1 mysql的安装

    win10 总之前期的步骤大概有:1下载安装:2 安装好后配置环境变量:3:登陆数据库 1:安装 mysql有安装版和直接解压就可以用的,据说大神都是安装的直接解压的,但鉴于自己是小白,就整了个安装版 ...

  2. .net学习笔记----WebConfig常用配置节点介绍

    一.配置文件入门 .Net提供了一种保存项目配置信息的办法,就是利用配置文件,配置文件的后缀一般是.config.在WinForm程序中配置文件一般是App.config.在Asp.net中一般默认是 ...

  3. OS Boot Loader -- 启动器

    这篇文章先抛出来,现在还没有彻底研究明白,但可以做个个人的小结和整理: 记得刚开始搞Linux的时候,普遍采用的是grub,后来有了grub2,尤其是在ubuntu那种非常差劲的不稳定的更新频繁的系统 ...

  4. Delphi版本顺序

    1.02.03.04.05.06.07.08.0200520062007 现在应该又出新的版本了

  5. spring 集成 log4j 配置

    在web.xml中增加如下代码: <context-param> <param-name>log4jConfigLocation</param-name> < ...

  6. 解决css样式被内置样式覆盖的问题

    .preImg { height:400px !important } <img id="preImg" class="preImg" style=&qu ...

  7. Jquery获取iframe子/父窗口中的标签

    获取子窗口中的标签: $("#id",document.frames('iframename').document); 获取父窗口中的标签: $('#id', parent.doc ...

  8. 在ASP.NET 5中读取配置文件

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 在ASP.NET 5中摒弃了之前配置文件的基础结构,引入了一个全新配置文件系统.今天推荐的文 ...

  9. 使用AStyle进行代码格式化

    转自:http://www.cnblogs.com/JerryTian/archive/2012/09/20/AStyle.html 在日常的编码当中,大家经常要遵照一些设计规范,如命名规则.代码格式 ...

  10. mysql中sql语句

    <数据定义语言DDL> 一. create TABLE tableName 创建表 二. alter TABLE tableName 修改表 三. drop TBALE tableName ...