BZOJ3919 : [Baltic2014]portals
预处理出每个点上下左右能延伸到的最远点以及到它们的距离的最小值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的更多相关文章
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ 3916: [Baltic2014]friends( hash )
字符串哈希..然后枚举每一位+各种判断就行了 ----------------------------------------------------------------------------- ...
- 学习React系列(七)——Fragments、Portals、Error Boundaries与WEB组件
React.Fragment portals Error Boundaries WEB组件 React.Fragment 想象一个场景,想把td包装为组件添加到table中去,代码如下: class ...
- BZOJ_3916_[Baltic2014]friends_hash
BZOJ_3916_[Baltic2014]friends_hash 题意: 有三个好朋友喜欢在一起玩游戏,A君写下一个字符串S,B君将其复制一遍得到T,C君在T的任意位置(包括首尾)插入一个字符得到 ...
- Angular动态创建组件之Portals
这篇文章主要介绍使用Angular api 和 CDK Portals两种方式实现动态创建组件,另外还会讲一些跟它相关的知识点,如:Angular多级依赖注入.ViewContainerRef,Por ...
- react 插槽(Portals)
前言: 昨天刚看了插槽,以为可以解决我工作中遇到的问题,非常激动,我今天又仔细想了想,发现并不能解决... 不过还是记录一下插槽吧,加深印象,嗯,就酱. 插槽作用: 插槽即:ReactDOM.crea ...
- Codeforces 196E Opening Portals MST (看题解)
Opening Portals 我们先考虑如果所有点都是特殊点, 那么就是对整个图求个MST. 想在如果不是所有点是特殊点的话, 我们能不能也 转换成求MST的问题呢? 相当于我们把特殊点扣出来, 然 ...
- react portals
来源:https://segmentfault.com/a/1190000011668286 Portals是react 16.3 提供的官方解决方案,使得组件可以脱离父组件层级挂载在DOM树的任何位 ...
- C - Portals Gym - 102006C (网络流最小割)
题目链接:https://cn.vjudge.net/contest/283918#problem/C 题目大意:T个测试数据,然后给你一个字符串,每一个字符串包括‘s’,‘t’,‘o’,‘#’,‘. ...
随机推荐
- 学号160809212姓名田京诚C语言程序设计实验2选择结构程序设计
编写一个C程序,输入3个数,并按由大到小的顺序输出. 1 #include <stdio.h> void main(){ int a,b,c,t; printf("请输入三个整数 ...
- dex和odex相互转换
一.dex和odex dex是安卓dalvik虚拟机的可执行文件,可以在导出的apk文件里用解压缩软件直接打开.odex是经过优化过的dex.odex一种是从apk程序中提取出来的,与apk文件存放在 ...
- HDOJ 1863 prim算法 HDOJ 1879
#include<cstdio> #include<cstring> #define inf 0xffffff ][]; int ans; void prim(int n) { ...
- CPU tick counter
#define rdtscll(val) \ __asm__ __volatile__ ("rdtsc" : "=A" (val)) example #incl ...
- Linux系统排查1——内存篇
常见工作中,计算机系统的资源主要包括CPU,内存,硬盘以及网络,过度使用这些资源将使系统陷入困境.本系列一共四篇博文,结合我在实习期间的学习,介绍一些常见的Linux系统排障工具及方法. 第1篇——内 ...
- jsp页面之间传参用el表达式获取
jsp页面之间传参用el表达式获取 参数方法:${param.参数名} session方法:${session.变量名}
- CodeForces - 416A (判断大于小于等于 模拟题)
Guess a number! Time Limit: 1000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Sub ...
- 解决iphone5,5s有锁版(AU,SB,S版等等)ios7越狱后+86、FT、IM等一切问题
最近无聊,给大家发一个关于完美解决iphone5,5c.5s有锁版本机号码.+86.短信.facetime.imessage等问题.是ios7系统哦!(本人亲测iphone5 SB版 双模卡解锁)相当 ...
- ytu 1301:Excel地址转换(水题,进制转换)
Excel地址转换 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 41 Solved: 11[Submit][Status][Web Board] D ...
- hdu 1018:Big Number(水题)
Big Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...