[bzoj2574] [Poi1999]Store-Keeper
坑啊。。
膜了半天byvoid大爷的题解。https://www.byvoid.com/blog/poi-1999-mag/?replytocom=1335/
一开始从人的位置bfs一波,看看能走到初始包裹哪些方向上。要注意不能穿过初始包裹...byvoid的标程在处理穿过包裹什么的地方有问题...但数据略弱。
之后如题解所述。
发现自己不会求点双连通分量QAQ。。那部分就抄标程了...
大概就是记录一下当前走过的边,遇到割点就一直出栈...和求强连通分量差不多,就是一个点可能在多个点双里面..这个比较烦
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
const int xx[]={-,,,},yy[]={,,-,};
struct zs{int too,pre;}e[maxn<<];int tot,last[maxn];
int too[],pre[],la[maxn],tt,st1[maxn],top,cnt,st2[maxn],uuu[][][][];bool uu[maxn];
struct poi{int x,y;}S,T,M;
struct zs1{int x,y,dir;}dl[maxn<<];
int dfn[maxn],low[maxn],tim;
bool gd[maxn],u[maxn];
int id[][],dis[][][],q[maxn];
char mp[][];
int i,j,k,n,m,man,st,ed; inline void ins(int a,int b){
int i=la[a];
while(i&&too[i]!=b)i=pre[i];
if(i)return;
too[++tt]=b,pre[tt]=la[a],la[a]=tt;
}
inline bool same(int a,int b){
int i;bool flag;
for(i=la[a];i;i=pre[i])uu[too[i]]=;
for(i=la[b];i&&!uu[too[i]];i=pre[i]);
flag=i!=;
for(i=la[a];i;i=pre[i])uu[too[i]]=;
return flag;
}
inline bool canget(int x,int y,int dir1,int dir2){
if(!gd[id[x][y]])return ;
if(uuu[x][y][dir1][dir2]<)
return (uuu[x][y][dir1][dir2]=same( id[x+xx[dir1]][y+yy[dir1]] , id[x+xx[dir2]][y+yy[dir2]] ));
else return uuu[x][y][dir1][dir2];
}
void tarjan(int x,int fa){
dfn[x]=low[x]=++tim;int too,u,v;
for(int i=last[x];i;i=e[i].pre)if(dfn[e[i].too]<dfn[x]){
too=e[i].too;
if(!dfn[too]){
st1[++top]=x,st2[top]=too;
tarjan(too,x),low[x]=min(low[x],low[too]);
if(low[too]>=dfn[x]){
gd[x]=;
cnt++;
do{
u=st1[top],v=st2[top],
ins(u,cnt),ins(v,cnt),top--;
}while((u!=x||v!=too)&&(u!=too||v!=x));
}
}
else low[x]=min(low[x],dfn[e[i].too]);
}
} inline void insert(int a,int b){
e[++tot].too=b,e[tot].pre=last[a],last[a]=tot,
e[++tot].too=a,e[tot].pre=last[b],last[b]=tot;
} inline bool check(int x,int y){return x>&&y>&&x<=n&&y<=m&&mp[x][y]!='S';} inline void bfs(int s){
int l=,r=,i,now;q[]=s,u[s]=;
while(l<r)
for(i=last[now=q[++l]];i;i=e[i].pre)if(!u[e[i].too]&&e[i].too!=st)
u[e[i].too]=,q[++r]=e[i].too;
}
inline int run(){
int l=,r=,i,nx,ny,ndir,ndis,x,y;
for(i=;i<;i++){
x=S.x+xx[i],y=S.y+yy[i];
if(check(x,y)&&u[id[x][y]])dl[++r]=(zs1){S.x,S.y,i},dis[S.x][S.y][i]=;//,printf("st:%d,%d\n",x,y);
}
while(l<r){
l++,nx=dl[l].x,ny=dl[l].y,ndir=dl[l].dir,ndis=dis[nx][ny][ndir];
x=nx+xx[ndir^],y=ny+yy[ndir^];//printf("case:%d,%d dis:%d dir:%d\n",nx,ny,ndis,ndir);
if(!check(x,y))continue;
if(x==T.x&&y==T.y)return ndis;
for(i=;i<;i++)
if(check(x+xx[i],y+yy[i])&&!dis[x][y][i]&&canget( x,y,ndir,i ))
dis[x][y][i]=ndis+,dl[++r]=(zs1){x,y,i};
}
return -;
}
int main(){
memset(uuu,,sizeof(uuu));
scanf("%d%d",&n,&m);int tmp=;tot=;
for(i=;i<=n;i++){
scanf("%s",mp[i]+);
for(j=;j<=m;j++)if(mp[i][j]!='S'){
id[i][j]=++tmp;
for(k=;k<;k+=){
int x=i+xx[k],y=j+yy[k];
if(check(x,y))
insert(id[i][j],id[x][y]);//,printf("(%d,%d)-->(%d,%d)\n",x,y,i,j);
}
if(mp[i][j]=='M')man=tmp,M=(poi){i,j};
if(mp[i][j]=='P')st=tmp,S=(poi){i,j};
if(mp[i][j]=='K')ed=tmp,T=(poi){i,j};
}
}//return 233;
for(i=;i<=tmp;i++)if(!dfn[i])tarjan(i,);
// for(i=1;i<=n;i++)for(j=1;j<=m;j++)if(id[i][j]){
// if(mp[i][j]!='S')printf("(%d,%d) %d fa:%d\n",i,j,id[i][j],getfa(id[i][j]));
// if(gd[id[i][j]])printf(" gd: (%d,%d)\n",i,j);
// }
bfs(man);
int ans=run();
if(ans<)puts("NO");else printf("%d\n",ans);
}
[bzoj2574] [Poi1999]Store-Keeper的更多相关文章
- 如何删除mac keeper
如果不小心安装了mac keeper,基本是无法删除的,而且16年以前的方法都不管用.可以这样删除,我已经测试过了,下载https://data-cdn.mbamupdates.com/web/mba ...
- ZOJ 2601 Warehouse Keeper
Warehouse Keeper Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on ZJU. Origin ...
- iOS之App Store上架被拒Legal - 5.1.5问题
今天在看到App Store 上架过程中,苹果公司反馈的拒绝原因发现了这么一个问题: Legal - 5.1.5 Your app uses background location services ...
- 发布APP到app store
好久好久没写博客了,主要是 都在学习新东西,忙不赢啊. 近段时间在用AC平台学习开发移动APP, 今天开始发布应用. 在ac云控制台编译成ipa后,使用apple提供的Application Load ...
- External Configuration Store Pattern 外部配置存储模式
Move configuration information out of the application deployment package to a centralized location. ...
- redux-devtools 浏览器修改Store值
1. npm install --save-dev redux-devtools 2. npm instal. --redux-devtools-dock-monitor 3. 创建DevTools ...
- NopCommerce 在Category 显示 Store List列表
实现效果如下: 1.在前台Web的Category Menu显示 Store; 2.点击 Store 显示 Store List列表: 3.点击 列表Store 的 Company Name 进入该S ...
- Redux原理(一):Store实现分析
写在前面 写React也有段时间了,一直也是用Redux管理数据流,最近正好有时间分析下源码,一方面希望对Redux有一些理论上的认识:另一方面也学习下框架编程的思维方式. Redux如何管理stat ...
- 这两天遇到iphone使用app store下载免费软件,必须验证付款信息才能购物是怎么回事???
答案: 在你这台设备上再设置一下,具体方法是:1.点设置进入2.点iTunes Store 和App Store 3.点 Apple ID ,如果没设置,设置一下,如果有的,再点击 4.出现一上选择的 ...
随机推荐
- 将Maven的Web项目部署到windows的Tomcat里
这里我用的是win7和tomcat8,且tomcat8下载的是压缩包而非安装文件. 第一步:先将tomcat8安装服务,cmd里更改目录为tomcat8(即压缩包解压后的那个文件夹)的bin文件夹, ...
- EL表达式隐式对象
用户输入界面 ---------------------------------------------------------------------------------------- < ...
- 模板引擎(smarty)知识点总结II
今天咱们继续来学习smarty!!! 知识点1:对于三种变量 常量的引用 有哪三种变量?a.assign赋值 b.系统保留变量(包括:$smarty.get,$smarty.post,$smarty. ...
- Logback分别打印info日志和error日志
<?xml version="1.0" encoding="utf-8" ?><configuration> <appender ...
- 解决 react-router / react-router-dom v4 history不能访问的问题
今天我把react-router 升级了一下, 在使用react-router-dom 是,子组件使用this.props.history 找不到了,看看官方文档,找了半天也没找到,因为我是在异步执行 ...
- Scrapy1.4爬取笑话网站数据,Python3.5+Django2.0构建笑话应用
Part1:需求简要描述 1.抓取http://www.jokeji.cn网站的笑话 2.以瀑布流方式显示 Part2:安装爬虫框架Scrapy1.4 1. 安装Scrapy1.4 E:\django ...
- Wechat 微信端正确播放audio、video的姿势
在开发微信项目时,有在项目中播放音频(audio)和视频(video)的需求: 在开发中,我们会遇到的问题 audio.video在Android和IOS系统上的兼容性: video播放完成后,跳出浏 ...
- js 对象的值传递
一.变量赋值的不同 1.原始值 在将一个保存着原始值的变量复制给另一个变量时,会将原始值的副本赋值给新变量,此后这两个变量是完全独立的. 2.引用值: 在将一个保存着对象内存地址的变量复制给另一个变量 ...
- css实现切角效果
1. 一个切角 思路:如果我们要得到有一个切角的元素,我们只需要使用一个径向渐变就可以达到这个目标,这个渐变需要把一个透明色标放在切角处,然后再相同的位置设置另一个色标,并且把它的颜色设置成我们想要的 ...
- 第十章:Python の 网络编程基础(二)
本課主題 Python中的作用域补充 socketserver 源码 线程的介绍和操作实战 进程的介绍和操作实战 协程的介绍和操作实战 本周作业 Python中的作用域补充 Python世界里沒有块级 ...