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

  

时间: 2024-12-26 16:17:42

BZOJ3919 : [Baltic2014]portals的相关文章

BZOJ 3916: [Baltic2014]friends( hash )

字符串哈希..然后枚举每一位+各种判断就行了 -------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; const int MOD = 1000000007; const i

bzoj3917【Baltic2014】sequence

3917: [Baltic2014]sequence Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 190  Solved: 90 [Submit][Status][Discuss] Description 序列A由从N开始的连续K个数按顺序构成,现在将A中的每个数只保留某一个数码,记为序列B,给定K和B,求可能的最小的N Input 第一行一个数K,第二行K个数B_i Output 输出一个数N Sample Input 6 7 8 9 5

Codeforces 196 E. Opening Portals

Problem E. Opening Portals 首先根据传送门的性质,如果所有点都是传送门的话那么结果就是该图的最小生成树. 对于只有其中 k 个结点是传送门的图,只要在原算法的基础上稍作修改即可. 具体,对每个点求出 P[i] 和 D[i] .(表示距离这个点最近的传送门和其距离... 之后对每条边,再根据 D[x] + D[y] + w 作为关键字跑最小生成树.. 以上分别用一次多源 spfa(),和稍作修改的 Kruskal() 即可. E. Opening Portals time

[React] Render Elements Outside the Current React Tree using Portals in React 16

By default the React Component Tree directly maps to the DOM Tree. In some cases when you have UI elements like overlays or loading bars this can be limiting. React 16 therefor ships with the new portal feature allowing you to attach parts of the Com

react 插槽(Portals)

前言: 昨天刚看了插槽,以为可以解决我工作中遇到的问题,非常激动,我今天又仔细想了想,发现并不能解决... 不过还是记录一下插槽吧,加深印象,嗯,就酱. 插槽作用: 插槽即:ReactDOM.createPortal(child, container) ,由ReactDom提供的接口. 可以实现将子节点渲染到父组件DOM层次结构之外的DOM节点. 第一个参数(child)是任何可渲染的 React 子元素,例如一个元素,字符串或 片段(fragment).第二个参数(container)则是一个

react portals

来源:https://segmentfault.com/a/1190000011668286 Portals是react 16.3 提供的官方解决方案,使得组件可以脱离父组件层级挂载在DOM树的任何位置. 普通情况下,组件的render函数返回的元素会被挂载在它的父级组件上. import DemoComponent from './DemoComponent'; render() { // DemoComponent元素会被挂载在id为parent的div的元素上 return ( <div

Angular动态创建组件之Portals

这篇文章主要介绍使用Angular api 和 CDK Portals两种方式实现动态创建组件,另外还会讲一些跟它相关的知识点,如:Angular多级依赖注入.ViewContainerRef,Portals可以翻译为 门户 ,我觉得放到这里叫 入口 更好,可以理解为动态创建组件的入口,类似于小程序或者Vue中的Slot. cdk全名Component Development Kit 组件开发包,是Angular官方在开发基于Material Design的组件库时抽象出来单独的一个开发包,里面

【BZOJ】3916: [Baltic2014]friends

http://www.lydsy.com/JudgeOnline/problem.php?id=3916 #include <bits/stdc++.h> using namespace std; int n, ans[3]; char s[2000005]; void work(int now) { int l=1, r=n-(n>>1); if(now<2) ++r; int flag=0; //printf("%d\n", now); for(int

bzoj3918 [Baltic2014]Postman

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3918 [题解] 每日至少更一题啊qwq凑任务(迷 明显猜个结论:随便搜环就行了 然后搜环姿势错了我也很无奈啊... # include <stdio.h> # include <string.h> # include <algorithm> // # include <bits/stdc++.h> using namespace std; typede