预处理出每个点上下左右能延伸到的最远点以及到它们的距离的最小值md。

然后spfa,一个点除了可以以1的代价到达四周的点之外,还可以以md+1的代价到达四个方向能到达的最远点。

#include<cstdio>
const int N=1010,M=4194303;
int n,m,i,j,z,x,y,loc[N][N][4],dis[N][N][4],md[N][N],d[N][N],q[M+1][2],h,t;
bool a[N][N],in[N][N];char s[N];
inline void add(int x,int y){
if(!a[x][y]||d[x][y]<=z)return;
d[x][y]=z;
if(!in[x][y]){
in[x][y]=1;
if(z<d[q[h][0]][q[h][1]])h=(h+M)&M,q[h][0]=x,q[h][1]=y;else t=(t+1)&M,q[t][0]=x,q[t][1]=y;
}
}
int main(){
for(scanf("%d%d",&n,&m),i=1;i<=n;i++)for(scanf("%s",s+1),j=1;j<=m;j++){
a[i][j]=s[j]!='#',d[i][j]=~0U>>1;
if(s[j]=='S')d[i][j]=0,h=t=in[i][j]=1,q[1][0]=i,q[1][1]=j;
if(s[j]=='C')x=i,y=j;
}
for(i=1;i<=n;i++)for(j=1;j<=m;j++)if(a[i][j]){
if(a[i-1][j])loc[i][j][0]=loc[i-1][j][0],dis[i][j][0]=dis[i-1][j][0]+1;else loc[i][j][0]=i;
if(a[i][j-1])loc[i][j][1]=loc[i][j-1][1],dis[i][j][1]=dis[i][j-1][1]+1;else loc[i][j][1]=j;
}
for(i=n;i;i--)for(j=m;j;j--)if(a[i][j]){
if(a[i+1][j])loc[i][j][2]=loc[i+1][j][2],dis[i][j][2]=dis[i+1][j][2]+1;else loc[i][j][2]=i;
if(a[i][j+1])loc[i][j][3]=loc[i][j+1][3],dis[i][j][3]=dis[i][j+1][3]+1;else loc[i][j][3]=j;
md[i][j]=dis[i][j][0];
if(md[i][j]>dis[i][j][1])md[i][j]=dis[i][j][1];
if(md[i][j]>dis[i][j][2])md[i][j]=dis[i][j][2];
if(md[i][j]>dis[i][j][3])md[i][j]=dis[i][j][3];
}
while(((t+1)&M)!=h){
i=q[h][0],j=q[h++][1],h&=M,in[i][j]=0,z=d[i][j]+1;
add(i-1,j),add(i+1,j),add(i,j-1),add(i,j+1);
z+=md[i][j];
add(loc[i][j][0],j),add(i,loc[i][j][1]),add(loc[i][j][2],j),add(i,loc[i][j][3]);
}
return printf("%d",d[x][y]),0;
}

  

BZOJ3919 : [Baltic2014]portals的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  2. BZOJ 3916: [Baltic2014]friends( hash )

    字符串哈希..然后枚举每一位+各种判断就行了 ----------------------------------------------------------------------------- ...

  3. 学习React系列(七)——Fragments、Portals、Error Boundaries与WEB组件

    React.Fragment portals Error Boundaries WEB组件 React.Fragment 想象一个场景,想把td包装为组件添加到table中去,代码如下: class ...

  4. BZOJ_3916_[Baltic2014]friends_hash

    BZOJ_3916_[Baltic2014]friends_hash 题意: 有三个好朋友喜欢在一起玩游戏,A君写下一个字符串S,B君将其复制一遍得到T,C君在T的任意位置(包括首尾)插入一个字符得到 ...

  5. Angular动态创建组件之Portals

    这篇文章主要介绍使用Angular api 和 CDK Portals两种方式实现动态创建组件,另外还会讲一些跟它相关的知识点,如:Angular多级依赖注入.ViewContainerRef,Por ...

  6. react 插槽(Portals)

    前言: 昨天刚看了插槽,以为可以解决我工作中遇到的问题,非常激动,我今天又仔细想了想,发现并不能解决... 不过还是记录一下插槽吧,加深印象,嗯,就酱. 插槽作用: 插槽即:ReactDOM.crea ...

  7. Codeforces 196E Opening Portals MST (看题解)

    Opening Portals 我们先考虑如果所有点都是特殊点, 那么就是对整个图求个MST. 想在如果不是所有点是特殊点的话, 我们能不能也 转换成求MST的问题呢? 相当于我们把特殊点扣出来, 然 ...

  8. react portals

    来源:https://segmentfault.com/a/1190000011668286 Portals是react 16.3 提供的官方解决方案,使得组件可以脱离父组件层级挂载在DOM树的任何位 ...

  9. C - Portals Gym - 102006C (网络流最小割)

    题目链接:https://cn.vjudge.net/contest/283918#problem/C 题目大意:T个测试数据,然后给你一个字符串,每一个字符串包括‘s’,‘t’,‘o’,‘#’,‘. ...

随机推荐

  1. Leetcode 之Construct Binary Tree(52)

    根据先序和中序构造二叉树.根据中序和后序构造二叉树,基础题,采用递归的方式解决,两题的方法类似.需要注意的是迭代器的用法. //先序和中序 TreeNode *buildTree(vector< ...

  2. 坚持不懈之linux haproxy的配置文件关键字查询手册

    1.关键词balance balance用于定义负载均衡的算法,可用于defaults.listen和backend中. balance使用方法如下: balance <algorithm> ...

  3. django-cms 代码研究(三)插件(plugs in)

    插件(plugs in) djangocms支持的插件有: http://docs.django-cms.org/en/latest/basic_reference/plugin_reference. ...

  4. vim实用技巧

    <1> 删除空格: :% s/ //gi    #正则为一个空格,替换为空,全局匹配. <2> 删除空行: :g /^\n*$/ d  #g为global  正则为:行开始+换 ...

  5. Redis学习手册(Sorted-Sets数据类型)

    一.概述: Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中.它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score ...

  6. IP地址,子网掩码,默认网关

    IP地址: 是给每个连接在Internet上的主机分配的一个32bit地址. 地址有两部分组成,一部分为网络地址,另一部分为主机地址. IP地址分为A.B.C.D.E 5类.常用的是B和C两类. 网络 ...

  7. windows下不打开浏览器访问网页的方法

    我们打开电脑,大多时候都是打开浏览器在上网.这都是通过浏览器来实现的,然而windows下有没有办法不通过浏览器也可以像linux那样达到访问网页的目的呢?这当然少不了批处理或者VBScript.然而 ...

  8. 在Xcode5和Android Studio添加工程间的依赖

    正在编辑中,尚未完成 先看看ios的target是什么,请先参看http://www.cocoachina.com/bbs/read.php?tid-10884.html做个大概了解 这里有一篇文章, ...

  9. MongoDB副本集学习(一):概述和环境搭建

    MongoDB副本集概述 以下图片摘自MongoDB官方文档:http://docs.mongodb.org/manual/core/replication-introduction/ Primary ...

  10. 【JAVA、C++】LeetCode 002 Add Two Numbers

    You are given two linked lists representing two non-negative numbers. The digits are stored in rever ...