设$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. 《Thinking in Java》十四章类型信息_习题解

    1~10    Page 318 练习1. 在ToyTest.java中,将Toy的默认构造器注释掉,并解释发生的现象. 书中代码如下(略有改动): package org.cc.foo_008; p ...

  2. Retrofit学习入门

    Retrofit的使用 设置权限与添加依赖 定义请求接口 通过创建一个retrofit生成一个接口的实现类(动态代理) 调用接口请求数据 设置权限与添加依赖 权限:首先确保在AndroidManife ...

  3. Python中如何读取xml的数据

    <?xml version="1.0" encoding="utf-8" ?> - <catalog> <maxid>4&l ...

  4. Tomcat的Session管理机制

    >>Session和Cookie请求的过程 Http连接本身是无状态的,即前一次发起的连接跟后一次没有任何关系,是属于两次独立的连接请求,但是互联网访问基本上都是需要有状态的,即服务器需要 ...

  5. 菜鸟学Linux命令:lsof命令 查找指定用户、进程、端口打开的文件

    lsof,list open files, 是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件. 命令格式:ls ...

  6. java 泛型 -- 泛型类,泛型接口,泛型方法

    泛型T泛型的许多最佳例子都来自集合框架,因为泛型让您在保存在集合中的元素上指定类型约束.在定义泛型类或声明泛型类的变量时,使用尖括号来指定形式类型参数.形式类型参数与实际类型参数之间的关系类似于形式方 ...

  7. 实现VS2010整合NUnit进行单元测试(转载)

    代码编写,单元测试必不可少,简单谈谈Nunit进行单元测试的使用方式: 1.下载安装NUnit(最新win版本为NUnit-2.6.4.msi) http://www.nunit.org/index. ...

  8. EMC DATA DOMAIN 2200 filesys destroy(數據清空及重建)

    EMC 數據清空 1.數據清空 這裡會清空file system的所有東西包括tapes

  9. wp8 入门到精通 ---转换

             /// <summary>        /// 颜色字符串转Color        /// </summary>        public static ...

  10. CQRS及.NET中的参考资料

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:CQRS作为一种设计模式,其实一点都不新鲜了.不过今天有朋友感叹.NET朋友也关注CQ ...