BZOJ4290 传送门
昨天考试考了这道题,学校评测不开O2被卡的一愣一愣的。
这种题线性复杂度就线性复杂度,为什么要卡常数。
顺便提一句,GRH大爷O(m*n*ans)的算法有90分,我的O(m*n)算法75。(万恶的STL)
这是什么烂数据(只是吐槽我们学校的数据,与BZOJ无关)
那我们来讲一讲做法:(首先,这是一道SB题)
我们考虑传送的行为:
1.如果一个传送门被穿越,那么从此以后进的那个门一定不用回去,出的那个门可以在出去以后立即打一枪替换。所以从此这两个门都不用进了
2.如果我们从一个传送门出来,那么我们一定有一个时刻枪可以打到传送门所在位置。
3.我们考虑这个位置:打完这一枪以后,在哪里开传送门并不重要,都可以到达。那么我们就贪心地走到最近的一面墙就可以了(这一步等价于建立一条从这个点到所有枪可以到达的点建立了一条长度为t+1的边(t为当前点到最近的贴墙空地的距离)
下面是代码:
/**************************************************************
Problem: 4290
User: CYZ
Language: C++
Result: Accepted
Time:2444 ms
Memory:81668 kb
****************************************************************/ #include<cstdio>
#include<queue>
#include<list>
using namespace std ; const int MAXR = + ;
int C , R ;
char M [ MAXR ] [ MAXR ] ;
int dis1 [ MAXR ] [ MAXR ] ;
int dis2 [ MAXR ] [ MAXR ] ;
bool vis [ MAXR ] [ MAXR ] ;
int s1 [ MAXR ] [ MAXR ] ;
int s2 [ MAXR ] [ MAXR ] ;
int s3 [ MAXR ] [ MAXR ] ;
int s4 [ MAXR ] [ MAXR ] ; queue < pair < int , int > > q ;
queue < pair < int , int > , list < pair < int , int > > > Q [ * + ] ;
int cx , cy ;
int ans = - ; void P ( const int x , const int y ) {
if ( x < || x > C + || y < || y > R + || dis1 [ x ] [ y ] != ) return ;
dis1 [ x ] [ y ] = ;
q . push ( make_pair ( x , y ) ) ;
} template < class T1 , class T2 >
void min_equal ( T1 & a , const T2 & b ) {
if ( a > b ) a = b ;
} template < class T1 , class T2 >
void max_equal ( T1 & a , const T2 & b ) {
if ( a < b ) a = b ;
} int main () {
/*
freopen ( "portals.in" , "r" , stdin ) ;
freopen ( "portals.out" , "w" , stdout ) ;
*/
scanf ( "%d%d" , & R , & C ) ;
for ( int x = ; x <= R ; ++ x ) scanf ( "%s" , M [ x ] + ) ;
for ( int x = ; x <= R + ; ++ x ) M [ x ] [ ] = M [ x ] [ C + ] = '#' ;
for ( int y = ; y <= C + ; ++ y ) M [ ] [ y ] = M [ R + ] [ y ] = '#' ;
for ( int x = ; x <= R ; ++ x )
for ( int y = ; y <= C ; ++ y ) {
dis2 [ x ] [ y ] = ;
if ( M [ x ] [ y ] == 'S' ) {
Q [ ] . push ( make_pair ( x , y ) ) ;
} else if ( M [ x ] [ y ] == 'C' ) {
cx = x ;
cy = y ;
}
}
for ( int x = ; x <= R + ; ++ x )
for ( int y = ; y <= C + ; ++ y )
dis1 [ x ] [ y ] = M [ x ] [ y ] == '#' ;
for ( int x = ; x <= R + ; ++ x )
for ( int y = ; y <= C + ; ++ y )
if ( M [ x ] [ y ] == '#' ) {
P ( x + , y ) ;
P ( x - , y ) ;
P ( x , y - ) ;
P ( x , y + ) ;
}
while ( ! q . empty () ) {
const int x = q . front () . first ;
const int y = q . front () . second ;
q . pop () ;
if ( dis1 [ x + ] [ y ] == ) {
dis1 [ x + ] [ y ] = dis1 [ x ] [ y ] + ;
q . push ( make_pair ( x + , y ) ) ;
}
if ( dis1 [ x - ] [ y ] == ) {
dis1 [ x - ] [ y ] = dis1 [ x ] [ y ] + ;
q . push ( make_pair ( x - , y ) ) ;
}
if ( dis1 [ x ] [ y + ] == ) {
dis1 [ x ] [ y + ] = dis1 [ x ] [ y ] + ;
q . push ( make_pair ( x , y + ) ) ;
}
if ( dis1 [ x ] [ y - ] == ) {
dis1 [ x ] [ y - ] = dis1 [ x ] [ y ] + ;
q . push ( make_pair ( x , y - ) ) ;
}
}
for ( int x = ; x <= R ; ++ x )
for ( int y = ; y <= C ; ++ y ) {
dis2 [ x ] [ y ] = - ;
if ( s1 [ x ] [ y ] == )
for ( int x2 = x ; M [ x2 ] [ y ] != '#' ; ++ x2 )
s1 [ x2 ] [ y ] = x ;
if ( s3 [ x ] [ y ] == )
for ( int y2 = y ; M [ x ] [ y2 ] != '#' ; ++ y2 )
s3 [ x ] [ y2 ] = y ;
}
for ( int x = R ; x >= ; -- x )
for ( int y = C ; y >= ; -- y ) {
if ( s2 [ x ] [ y ] == )
for ( int x2 = x ; M [ x2 ] [ y ] != '#' ; -- x2 )
s2 [ x2 ] [ y ] = x ;
if ( s4 [ x ] [ y ] == )
for ( int y2 = y ; M [ x ] [ y2 ] != '#' ; -- y2 )
s4 [ x ] [ y2 ] = y ;
}
for ( int t = ; ans == - ; ++ t ) {
queue < pair < int , int > ,
list < pair < int , int > > > & q = Q [ t ] ;
while ( ! q . empty () ) {
const int x = q . front () . first ;
const int y = q . front () . second ;
q . pop () ;
if ( vis [ x ] [ y ] ) continue ;
vis [ x ] [ y ] = true ;
dis2 [ x ] [ y ] = t ;
if ( x == cx && y == cy ) {
ans = t ;
break ;
}
if ( M [ x + ] [ y ] != '#' && ! vis [ x + ] [ y ] )
Q [ t + ] . push ( make_pair ( x + , y ) ) ;
if ( M [ x - ] [ y ] != '#' && ! vis [ x - ] [ y ] )
Q [ t + ] . push ( make_pair ( x - , y ) ) ;
if ( M [ x ] [ y + ] != '#' && ! vis [ x ] [ y + ] )
Q [ t + ] . push ( make_pair ( x , y + ) ) ;
if ( M [ x ] [ y - ] != '#' && ! vis [ x ] [ y - ] )
Q [ t + ] . push ( make_pair ( x , y - ) ) ;
if ( ! vis [ s1 [ x ] [ y ] ] [ y ] ) Q [ t + dis1 [ x ] [ y ] ] . push
( make_pair ( s1 [ x ] [ y ] , y ) ) ;
if ( ! vis [ s2 [ x ] [ y ] ] [ y ] ) Q [ t + dis1 [ x ] [ y ] ] . push
( make_pair ( s2 [ x ] [ y ] , y ) ) ;
if ( ! vis [ x ] [ s3 [ x ] [ y ] ] ) Q [ t + dis1 [ x ] [ y ] ] .
push ( make_pair ( x , s3 [ x ] [ y ] ) ) ;
Q [ t + dis1 [ x ] [ y ] ] .
push ( make_pair ( x , s4 [ x ] [ y ] ) ) ;
}
}
/*
for ( int x = 1 ; x <= R ; ++ x ) {
for ( int y = 1 ; y <= C ; ++ y ) printf ( "%2d " , dis2 [ x ] [ y ] ) ;
putchar ( '\n' ) ;
}*/
printf ( "%d\n" , ans ) ;
return ;
}
BZOJ4290 传送门的更多相关文章
- 【hrbust2294】修建传送门
题意 哈理工2016级新生程序设计全国邀请赛B题 n个点1~n,i到i+1的距离为a[i],现在可以在两个点之间建一个传送门,则两点之间距离为0,求建传送门后1号出发的最远距离最小是多少? 题解 a[ ...
- [openwrt 项目开发笔记]: 传送门
“Openwrt 项目开发笔记”系列传送门: [Openwrt 项目开发笔记]:Openwrt平台搭建(一) (2014-07-11 00:11) [Openwrt 项目开发笔记]:Openwrt平台 ...
- codevs2059逃出克隆岛(传送门bfs)
/* 和普通的迷宫问题类似只是多了一个叫传送门的东西 对于传送门的处理: 每当跑到传送门就把其余所有传送门周围的点都入队 传送门之间不花费时间并且从不是传送门的点走到传送门 也不花费时间花费时间的(好 ...
- unity传送门类似效果实现
简述 在传送门中,核心的玩法是在地上或者墙上打开2个可以联通的洞来实现传送的效果.以此扩展加入解谜要素构成游戏的核心. 这里尝试使用unity来实现传送门的核心功能,具体功能分析如下: 1.传送门的模 ...
- Java编译过程(传送门)
我不是要做一门编程语言,了解这个对我现在的工作也没什么帮助,纯粹好奇而已. 传送门
- Test传送门(更新中)
一.Codeforces传送门: Avito Code Challenge 2018 题解传送门 Codeforces Round #485 (Div. 2) 题解传送门 二.hihocode ...
- 【bzoj题解】题解传送门
如题,题解传送门: 1001 1008 1012
- HDU 2102 A计划(两层地图加时间限制加传送门的bfs)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2102 A计划 Time Limit: 3000/1000 MS (Java/Others) Me ...
- JZOJ 5906. 传送门
Description 8102年,Normalgod在GLaDOS的帮助下,研制出了传送枪.但GLaDOS想把传送枪据为己有,于是把Normalgod扔进了一间实验室.这间实 ...
随机推荐
- Mysql读写分离,主从同步实现
随着用户量的增多,数据库操作往往会成为一个系统的瓶颈所在,因此我们可以通过实现数据库的读写分离来提高系统的性能. 通过设置主从数据库实现读写分离,主库负责“写”操作,从库负责“读”操作,根据压力情况, ...
- Promise 的基础用法
Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案–回调函数和事件--更合理和更强大.它由社区最早提出和实现,ES6将其写进了语言标准,统一了语法,原生提供了Promi ...
- JZOJ 5941. 乘
Sample Input Sample Input1: 4 3 9 6 5 8 7 7 Sample Output Sample Output1: 0做法(转自JZOJ):考虑 a 是定值, 而 b ...
- Java --本地提交MapReduce作业至集群☞实现 Word Count
还是那句话,看别人写的的总是觉得心累,代码一贴,一打包,扔到Hadoop上跑一遍就完事了????写个测试样例程序(MapReduce中的Hello World)还要这么麻烦!!!?,还本地打Jar包, ...
- springMVC3
复习: springmvc框架: DispatcherServlet前端控制器:接收request,进行response HandlerMapping处理器映射器:根据url查找Handler.(可以 ...
- (数据科学学习手札34)多层感知机原理详解&Python与R实现
一.简介 机器学习分为很多个领域,其中的连接主义指的就是以神经元(neuron)为基本结构的各式各样的神经网络,规范的定义是:由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系 ...
- python2.7练习小例子(二十三)
23):题目:求1+2!+3!+...+20!的和. 程序分析:此程序只是把累加变成了累乘. #!/usr/bin/python # -*- coding: UTF-8 -*- n = ...
- python2.7练习小例子(二十一)
21):1.题目:两个乒乓球队进行比赛,各出三人.甲队为a,b,c三人,乙队为x,y,z三人.已抽签决定比赛名单.有人向队员打听比赛的名单.a说他不和x比,c说他不和x,z比,请编程序找出三队 ...
- java 单例模式(singleton)
概念: 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 要点: 1.某个类只有一个实例. 2.它必须自行创建这个示例. 3.必须自行向整个系统提供这个示例. 实现: 1.拥有一个私有的构造器. ...
- django生产环境中部署
https://www.cnblogs.com/chenice/p/6921727.html 本节内容 uwsgi 介绍 uwsgi安装使用 nginx安装配置 django with nginx 如 ...