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' ...
随机推荐
- 51nod1006(lcs)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1006 题意:中文题诶- 思路:最长公共子序列模板题- 我们用d ...
- CSS3–1.css3 新增选择器
1.后代级别选择器 2.同辈级别选择器 3.伪类选择器 4.属性选择器 5.UI伪类选择器 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 T ...
- 23.备忘录模式(Memento Pattern)
using System; using System.Collections.Generic; namespace ConsoleApplication6 { /// <summary> ...
- linux后台运行和关闭、查看后台任务
转自:http://www.cnblogs.com/kaituorensheng/p/3980334.html fg.bg.jobs.&.nohup.ctrl+z.ctrl+c 命令 一.&a ...
- 重温WCF之一个服务实现多个契约(二)
public class ServiceImp : IService1,IService2,IService3 { public string SayHelloA() { return "你 ...
- 数据结构之图 Part3 – 2 遍历
BFS using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...
- 在IIS上部署SSL
背景: 在处理DropboxAPI开发时,其重定向的URL地址必须是https的[除了localhost],不得已在自己网站上加了ssl,下面简单介绍下添加自签名证书,毕竟只是临时使用. 1.打开II ...
- 第二十三篇:在SOUI中使用LUA脚本开发界面
像写网页一样做客户端界面可能是很多客户端开发的理想. 做好一个可以实现和用户交互的动态网页应该包含两个部分:使用html做网页的布局,使用脚本如vbscript,javascript做用户交互的逻辑. ...
- Eclipse 快捷键 自动生成get/set注释(转)
Alt+Shit+S Generaet Getter and Setter 选中Generate method comments 文本编辑 复制行 Ctrl+Alt+向下键 编辑文本 快捷键:选中接 ...
- HDU 3727 Jewel 可持久化线段树
Jewel Problem Description Jimmy wants to make a special necklace for his girlfriend. He bought man ...