莫名其妙还找到了另一个铟炔锶烃的OJ : Codeup墓地

25481: swan

时间限制: 1 Sec  内存限制: 128 MB
献花: 86  解决: 13
[献花][花圈][TK题库]

题目描述

两头白天鹅生活在一个部分湖面结了冰的湖泊中,湖面的形状为一个长方形,并且被分割成R行C列的小方格,某些方格中结了冰,这样的方格称之为冰格,其余的方格称之为水格。

冬天过去了,湖面上的冰渐渐开始溶解了,每一天与水相邻的冰格就将消融而转化为水格。所谓两个方格相邻是指它们在水平或垂直方向有公共边,两个呈对角的方格是不相邻的,下图给出样例数据的演化过程。

白天鹅只能在水中沿水平或垂直方向游动,写一个程序判断多少天后两只白天鹅才能够相会。

输入

输入文件第一行包含两个用空格隔开的整数R 和C,其中1≤R,C≤1500,接下来的R行每行包含C个字符,描述湖面的初始状态,‘·’表示水格,‘X’表示冰格,‘L’表示一只白天鹅。

输出

输出文件仅一行包含一个整数表示两只白天鹅等到相邻那一天所需的天数。

样例输入

8 17
...XXXXXX..XX.XXX
....XXXXXXXXX.XXX
...XXXXXXXXXXXX..
..XXXXX.LXXXXXX..
.XXXXXX..XXXXXX..
XXXXXXX...XXXX...
..XXXXX...XXX....
....XXXXX.XXXL...

样例输出

2

首先我们可以看到这个动态消融的过程非常铟炔锶烃, 但是仔细想想后我们发现, 每块冰都有一个固定的消融时刻, 而这个时刻可以通过BFS预处理出来.

预处理的方式是将所有水方块入队, 每次取队首结点更新其相邻结点, 更新后新结点入队. 处理直至队列为空.

从一个 $L$ 到另一个 $L$ 中的路径中的结点的融化时间的最大值即为此条路径可用的时间. 而我们的任务实际上就是找到最早可用的路径的可用时刻.

所以这个问题似乎就变成了最短路问题. 不过不同的是平常的最短路是最小化边权/点权的和, 而这次我们要最小化的是路径中边权/点权的最大值. 这种时候不用方, 祭出我们万能的OI三大玄学之一 $SPFA$ 来跑一遍就得出解了OwO

(原题似乎丧病地卡了 std::queue ...给出题人 $2147483647$ 个差评(╯‵□′)╯︵┻━┻然而懒得实现循环队列就开了 $30M$ 个结构体, 每个结构体里两个 int ...(炸内存边缘))

参考代码

GitHub

 #include <queue>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> const int MAXN=; struct Point{
int x;
int y;
Point(int x=,int y=){
this->x=x;
this->y=y;
}
}; int n;
int m;
int l=,r=;
int xa,ya,xb,yb;
Point q[];
int dis[MAXN][MAXN];
int melt[MAXN][MAXN];
bool visited[MAXN][MAXN]; void BFS();
void gch(char&);
void Initialize();
void SPFA(int,int); int main(){
Initialize();
BFS();
SPFA(xa,ya);
printf("%d\n",dis[xb][yb]);
return ;
} void SPFA(int x,int y){
memset(visited,,sizeof(visited));
dis[x][y]=;
q[r++]=(Point(x,y));
visited[x][y]=true;
while(l<r){
x=q[l].x;
y=q[l].y;
l++;
visited[x][y]=false;
if(x>&&dis[x][y]<dis[x-][y]&&dis[x-][y]!=melt[x-][y]){
dis[x-][y]=std::max(dis[x][y],melt[x-][y]);
if(!visited[x-][y]){
visited[x-][y]=true;
q[r++]=(Point(x-,y));
}
}
if(x<n&&dis[x][y]<dis[x+][y]&&dis[x+][y]!=melt[x+][y]){
dis[x+][y]=std::max(dis[x][y],melt[x+][y]);
if(!visited[x+][y]){
visited[x+][y]=true;
q[r++]=(Point(x+,y));
}
}
if(y>&&dis[x][y]<dis[x][y-]&&dis[x][y-]!=melt[x][y-]){
dis[x][y-]=std::max(dis[x][y],melt[x][y-]);
if(!visited[x][y-]){
visited[x][y-]=true;
q[r++]=(Point(x,y-));
}
}
if(y<m&&dis[x][y]<dis[x][y+]&&dis[x][y+]!=melt[x][y+]){
dis[x][y+]=std::max(dis[x][y],melt[x][y+]);
if(!visited[x][y+]){
visited[x][y+]=true;
q[r++]=(Point(x,y+));
}
}
}
} void BFS(){
memset(visited,,sizeof(visited));
while(l<r){
int x=q[l].x;
int y=q[l].y;
++l;
if(x>&&!visited[x-][y]&&melt[x][y]+<melt[x-][y]){
melt[x-][y]=melt[x][y]+;
visited[x-][y]=true;
q[r++]=(Point(x-,y));
}
if(x<n&&!visited[x+][y]&&melt[x][y]+<melt[x+][y]){
melt[x+][y]=melt[x][y]+;
visited[x+][y]=true;
q[r++]=(Point(x+,y));
}
if(y>&&!visited[x][y-]&&melt[x][y]+<melt[x][y-]){
melt[x][y-]=melt[x][y]+;
visited[x][y-]=true;
q[r++]=(Point(x,y-));
}
if(y<m&&!visited[x][y+]&&melt[x][y]+<melt[x][y+]){
melt[x][y+]=melt[x][y]+;
visited[x][y+]=true;
q[r++]=(Point(x,y+));
}
}
} void Initialize(){
char ch;
memset(dis,0x3F,sizeof(dis));
memset(melt,0x3F,sizeof(melt));
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
gch(ch);
if(ch=='.'){
q[r++]=(Point(i,j));
melt[i][j]=;
visited[i][j]=true;
}
else if(ch=='L'){
q[r++]=(Point(i,j));
melt[i][j]=;
visited[i][j]=true;
if(xa==){
xa=i;
ya=j;
}
else{
xb=i;
yb=j;
}
}
}
}
} void gch(char& target){
do{
target=getchar();
}while(target!='.'&&target!='X'&&target!='L');
}

Backup

[Codeup 25481] swan的更多相关文章

  1. 暑假集训D13总结

    考试 又炸掉了= = 本来看着题就一脸茫然,默默的打暴力骗分,然后就交了卷= = 重要的是,在本机跑的毫无障碍的T3程序竟然在评测机CE啊喂,35分就没了啊喂(这可是比我现在分还高= =) 内心几近崩 ...

  2. [Codeup 25482]选美

    [Codeup 25482 ]选美 题目 一年一度的星哥选美又拉开了帷幕 N个人报名参加选拔,每个人都有着各自的相貌参数和身材参数(不大于 10000 的正整数).你的任务是尽可能让更多人被星哥选中, ...

  3. 开发 .swan 文件

    这部分是每个智能小程序页面的展现模板,类似于 Web 开发中的 HTML ,SWAN 模板中使用的标签均为 SWAN 组件规定的标签. <view s-for="item in ite ...

  4. swan.after

    解释: swan.after可以拦截所有当前运行小程序对于API的调用,默认传入function时,只在API函数调用的返回阶段拦截.如果传入Object,则可以选择拦截的阶段(例如: 返回阶段.回调 ...

  5. 阿里云代码管理平台 Teambition Codeup(行云)亮相,为企业代码安全护航

    2019杭州云栖大会企业协作与研发效能专场,企业协同平台Teambition负责人齐俊元正式发布阿里云自研的代码管理平台Teambition Codeup(行云),Codeup是一款企业级代码管理产品 ...

  6. 算法笔记刷题1(codeup 1934)

    准备6月份的拼题甲级中(本来现在这两天就考试了,但是因为疫情的原因延期了) 刚刚开始按算法笔记刷题,今天是探索codeup的第一天. 一开始并没有把多点测试当回事,直到一错再错,心态爆炸... 附上我 ...

  7. 百度小程序中swan.setPageInfo的用法

    现在百度智能小程序是百度最新的流量入口,现在很多做SEO优化.小程序开发的企业为了获取更多的流量不得不开发了,很多的技术人员不了解百度小程序的标题和关键词.描述等信息不知道在哪里设置. 以下是小编给你 ...

  8. 如何从阿里云Code升级至云效Codeup

    如果你还在使用阿里云Code,不防看看如何从阿里云Code升级至云效Codeup,云效代码管理Codeup是阿里云出品的一款企业级代码管理平台,提供代码托管.代码评审.代码扫描.质量检测等功能,全方位 ...

  9. codeup模拟赛 进击的二叉查找数

    问题 B: 进击的二叉查找树 时间限制: 1 Sec 内存限制: 64 MB 提交: 1017 解决: 379 提交状态 题目描述 给定1~N的两个排列,使用这两个排列分别构建两棵二叉查找树(也就是通 ...

随机推荐

  1. 透析ARP原理

    对于ARP协议, 我本来是不了解的,只是解决了两个ARP相关的P2的Bug后,也就懂了.本文将从原理的角度对ARP做一个透析. 1. 什么是ARP? ARP(Address Resolution Pr ...

  2. kd树 C++实现

    参考:百科kd-tree /* * kdtree.h * * Created on: Mar 3, 2017 * Author: wxquare */ #ifndef KDTREE_H_ #defin ...

  3. NSSM - the Non-Sucking Service Manager

    nssm is a service helper which doesn't suck. srvany and other service helper programs suck because t ...

  4. Lineare Algebra

    Grundlegendes Wort: 矩阵列:Das Spalte von der Matrix 行列式:Die Determinante 对角矩阵:Die diagonal Matrix 逆矩阵: ...

  5. Eclipse 反编译之 JadClipse

    一:下载对应的 net.sf.jadclipse_x.x.x.jar ,把该jar包放入到Eclipse中的 plugins 目录下,下载地址:https://sourceforge.net/proj ...

  6. 撩课-Java每天5道面试题第8天

    撩课Java+系统架构 视频 点击开始学习 71.jsp有哪些内置对象?作用分别是什么? Page, pageContext, request, response, session, applicat ...

  7. JAVA基础之——使用idea创建maven项目 以及使用tomcat本地调试springmvc

    前言:关于这个话题网上有很多,本文旨在引导实战纠偏,理论偏少,如果按照步骤还不能达到本文目的,请留言. 1 环境准备 1.1 软件准备 idea:官方下载社区版,下载后安装 maven:Apache- ...

  8. Java SE 8 的流库学习笔记

    前言:流提供了一种让我们可以在比集合更高的概念级别上指定计算的数据视图.如: //使用foreach迭代 long count = 0; for (String w : words) { if (w. ...

  9. java工厂模式个人体会

    上一边文章主要对单例模式做了一个总结,这篇文章主要对工厂模式也写一写个人的体会. 工厂模式是设计模式的一种,它主要是把实现产品对象的过程封装起来,然后提供给客户端相应的接口.工厂模式也是有3种,分别为 ...

  10. 【一些简单的jQuery选择器】

    学习[js DOM 编程艺术],最后面有许多jQuery的选择器,每个都动手敲了一遍. jQuery 提供了高级选择器的方法. js获取元素的三个基本方法分别是通过标签名,类名和id,即(getEle ...