昨天考试考了这道题,学校评测不开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 ;
}

最新文章

  1. linux 多线程基础
  2. FastDFS介绍
  3. objective-c系列-NSMutableArray
  4. css设置background图片的位置实现居中
  5. php图片防盗链的小测试
  6. html和css基础
  7. iOS开发之——制作framework静态库教程
  8. android 检测sqlite数据表中字段(列)是否存在 (转)
  9. spark-submit [options]
  10. mysql字符串替换
  11. H. 硬币的水问题II
  12. Java谜题——类谜题(二)
  13. OSM数据下载地址
  14. springmvc文件下载之文件名下划线问题终极解决方案
  15. 学习Tensorflow,反卷积
  16. android6.0SDK 删除HttpClient的相关类的解决方法
  17. JavaScript 的 4 种数组遍历方法: for VS forEach() VS for/in VS for/of
  18. 简单SQL注入
  19. springboot应用无故停止运行killed解决方法
  20. 20145203盖泽双 《网络对抗技术》实践八:Web基础

热门文章

  1. react脚手架搭建1
  2. Hello,移动WEB—Viewport_Meta标签
  3. flutter开发之配置环境以及一些问题的处理方案~
  4. C#正则表达式Regex类的使用
  5. Delphi 过程类型
  6. Hadoop(11)-MapReduce概述和简单实操
  7. Linux基础(02)、MTPutty安装和使用
  8. 【Python让生活更美好01】os与shutil模块的常用方法总结
  9. 【动态规划】[UVA1025]A Spy in the Metro 城市里的间谍
  10. docker windows container的一些注意点