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;
}

  

时间: 2025-01-08 23:43:36

BZOJ1481 : Navigation Game的相关文章

JSF -&gt; 导航(Navigation)

在使用jsf框架时,肯定会用到faces-config.xml. 而其中就会出现很多的Navigation项. 其实这些Navigation就是一些页面跳转的东西. 以下内容来自http://blog.sina.com.cn/s/blog_600046120100to0e.html 导航(Navigation) 现在对jsf中的导航进行些小结,分为三部分来说,参考与core jsf 1,静态的导航 2,动态的导航 3,高级的导航 主要讨论在你web程序中如何配置导航,即如何让你的程序从一个页面跳

ROS机器人程序设计(原书第2版)补充资料 (捌) 第八章 导航功能包集入门 navigation

ROS机器人程序设计(原书第2版)补充资料 (捌) 第八章 导航功能包集入门 navigation 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中使用. 本章三个非常重要概念:TF,SLAM,AMCL.务必掌握. 补充内容:http://blog.csdn.net/zhangrelay/article/details/50299417 第216页: 简介本章要点. 第217页: 导航综合功能包组成架构等. 补充如下: 目录 配置并使用导航功能

POJ 1984 Navigation Nightmare 二维带权并查集

题目来源:POJ 1984 Navigation Nightmare 题意:给你一颗树 k次询问 求2点之间的曼哈顿距离 并且要在只有开始k条边的情况下 思路:按照方向 我是以左上角为根 左上角为原点 dx[i]为i点距离根的x坐标 dy[]是y坐标 这两个可以通过路径压缩求出 只不过是二维而已 #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; const int m

UINavigationController出现nested push animation can result in corrupted navigation bar的错误提示

今天在测试过程中,出现了这样一个bug,分别有两种情景: (前提是:app是基于UINavigationController构建的) 1.从Controller-A中push进来B.在B中点击返回,返回的界面为黑色一片.再做返回操作就crash了. 如图1: 2.从Controller-A中push进入B,此时B中tableview出现错位现象(图2),tableview被navigationbar覆盖了一部分,在B中再push一个C进来.此时只显示了C的navigationbar,但下方的vi

IOS 改变Navigation的返回按钮

两个办法: 1, 手动为每一个UIViewController添加navigationItem的leftButton的设置代码 2,为UINavigationController实现delegate,在pop和push的时候改变当前和上一页的navigationItem.title 以下是封装的一些基础方法,供参考: + (void) navigationItem:(UINavigationItem*)navigationItem setTitle:(NSString*)title; + (vo

WPF Navigation

在开始学习WPF时,一开始对WPF的Window, Page, UserControl感到很迷惑.不知道什么时候该使用哪一个.下面简单介绍一下这三者的区别. Window:故名思意,桌面程序的窗体.在WPF桌面应用中,我通常会只用一个主窗体,然后将不同的操作单元封装在不同的UserControl中,根据用户的操作展现不同的UserControl: Page:Page需要承载在窗体中,通过Navigation进行不同Page的切换,也是本篇博客中需要讲到的: UserControl:封装一些可以重

react-native 学习 ----- React Navigation

很久没有的登陆博客园了,密码都是找回的,从当年的大学生已经正常的走上了程序员的道路,看到之前发的博客还是写的android,现在自己已经在使用了react-native了. 大学毕业了,做了java后台台发,就再也没有写过移动端的东西了,知道rn的出现,发现这个比当年的web app phonegap好用多了就此一发不可收拾.公司app就是用的rn,我主要还是负责数据在store中的处理,框架也是公司大牛封装的,但是我心中总有一个移动端的梦想,所以我准备开始从零开始学习react-native.

while an existing transition or presentation is occurring; the navigation stack will not be updated

使用UIAlertController提示信息,在之后使用navigation进行逻辑跳转时,出现popToViewController:transition: called on <UINavigationController 0x7fc27b8ac000> while an existing transition or presentation is occurring; the navigation stack will not be updated.错误.如图: 原因:dismiss操

Xamarin.Forms学习之Page Navigation(一)

在最初接触Xamarin.Forms的时候,我是跟着Xamarin官方的名为“learning-xamarin-ebook”的pdf文档进行学习的,我在成功运行Hello world程序之后,我开始跟着pdf写上面的monkey实例,然而我却遇到了一个问题,我在列表页点击某一个Item的时候,不能如示例上面所展示的那样跳转到详细页面.也正因为此我在官方文档和电子书中寻找答案,也将自己的学习的东西做个简单的笔记和分享. 在Froms的中的提供了如下方法用于导航: Task PushAsync(Pa