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' ...
随机推荐
- 《Thinking in Java》十四章类型信息_习题解
1~10 Page 318 练习1. 在ToyTest.java中,将Toy的默认构造器注释掉,并解释发生的现象. 书中代码如下(略有改动): package org.cc.foo_008; p ...
- Retrofit学习入门
Retrofit的使用 设置权限与添加依赖 定义请求接口 通过创建一个retrofit生成一个接口的实现类(动态代理) 调用接口请求数据 设置权限与添加依赖 权限:首先确保在AndroidManife ...
- Python中如何读取xml的数据
<?xml version="1.0" encoding="utf-8" ?> - <catalog> <maxid>4&l ...
- Tomcat的Session管理机制
>>Session和Cookie请求的过程 Http连接本身是无状态的,即前一次发起的连接跟后一次没有任何关系,是属于两次独立的连接请求,但是互联网访问基本上都是需要有状态的,即服务器需要 ...
- 菜鸟学Linux命令:lsof命令 查找指定用户、进程、端口打开的文件
lsof,list open files, 是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件. 命令格式:ls ...
- java 泛型 -- 泛型类,泛型接口,泛型方法
泛型T泛型的许多最佳例子都来自集合框架,因为泛型让您在保存在集合中的元素上指定类型约束.在定义泛型类或声明泛型类的变量时,使用尖括号来指定形式类型参数.形式类型参数与实际类型参数之间的关系类似于形式方 ...
- 实现VS2010整合NUnit进行单元测试(转载)
代码编写,单元测试必不可少,简单谈谈Nunit进行单元测试的使用方式: 1.下载安装NUnit(最新win版本为NUnit-2.6.4.msi) http://www.nunit.org/index. ...
- EMC DATA DOMAIN 2200 filesys destroy(數據清空及重建)
EMC 數據清空 1.數據清空 這裡會清空file system的所有東西包括tapes
- wp8 入门到精通 ---转换
/// <summary> /// 颜色字符串转Color /// </summary> public static ...
- CQRS及.NET中的参考资料
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:CQRS作为一种设计模式,其实一点都不新鲜了.不过今天有朋友感叹.NET朋友也关注CQ ...