9.18考试 第三题chess题解
在讲这道题之前我们先明确一个丝薄出题人根本没有半点提示却坑死了无数人的注意点:
走敌人和不走敌人直接到时两种走法,但只走一个敌人和走一大坨敌人到同一个点只算一种方案(当然,前提是步骤一致)。
当时看完所有题后打算第一个打这道题,当时第一反应以为只是一个普普通通的宽搜,然后就发现我需要记录一下他走过那些敌人,然后就开始懵逼了,dfs能记录但太慢,bfs较快但无法记录,然后我只能在bfs中传递结构体,里面包含一个vector然后就全E了……
其实当时自己也是犯浑,过于局限于传统的棋盘搜索题了,对于敌人我们可以通过缩边,将敌人两侧的空格连在一起,然后就不必去担心卡死在里面了。不过我的方法相当麻烦,首先先对大棋盘建边,然后挨个tarjan,缩可以相互到达的敌人,然后又得重新建边,然后又需要在新边的基础上去缩边,总共搞了3次,自己都烦了,只能说挺练代码能力的……真的挺练的……
当然,我们完全可以dfs一下所有的敌人然后对于所有他们能连到的点之间相互建边,结果本博主太懒了,然后打了一个长了不知道几百倍的代码……
然后就是比较简单的spfa了。
不过对于第二问的答案,既然人家说了是long long 级别的,就一定有他的道理(虽然刚刚经过本博主踩雷发现改为int完全没问题,丝薄出题人……),所以由于棋盘有一个特殊性质:距离短的一定搜的早,所以我们只用记录一下到该点的方案数,更新距离是直接转移就好了。
#include<iostream> #include<cstdlib> #include<cstdio> #include<cstring> #include<queue> #include<algorithm> #include<cmath> #include<map> #include<vector> #define N 53 using namespace std; int n,m,c[N][N],zz1,zz2,zz5,zz,b[N*N],d[N*N],a[N*N]; ][]; int bh[N][N]; struct ro{ int to,l; int next; }road[N*N*],road2[N*N*],road3[N*N*]; void build2(int x,int y,int z) { zz2++; road2[zz2].to=y; road2[zz2].next=b[x]; road2[zz2].l=z; b[x]=zz2; } void build3(int x,int y,int z) { zz5++; road3[zz5].to=y; road3[zz5].l=z; road3[zz5].next=d[x]; d[x]=zz5; } void build(int x,int y) { zz++; road[zz].to=y; road[zz].next=a[x]; a[x]=zz; road[zz].l=; } bool check(int x,int y) { ||x>n); ||y>m); ); ; } bool rz[N*N],rz2[N*N],lt[N*N][N*N],lt2[N*N][N*N],rd[N*N]; ],top,dfn[N*N],low[N*N],zz3,belong[N*N],zz4,c2[N*N]; void tar(int x) { zz3++; low[x]=dfn[x]=zz3; rz[x]=rz2[x]=; top++; st[top]=x; ;i=road2[i].next) { int y=road2[i].to; ||c2[x]!=)continue; if(!rz2[y]) { tar(y); low[x]=min(low[x],low[y]); } else if(rz[y]) low[x]=min(low[x],dfn[y]); } if(low[x]==dfn[x]) { int v; zz4++; do{ v=st[top]; belong[v]=zz4; top--; rz[v]=; }while(dfn[v]!=low[v]); } } int dis[N*N],sx,sy,tx,ty,js[N*N]; void spfa() { memset(dis,0xf,sizeof(dis)); rd[belong[bh[sx][sy]]]=; dis[belong[bh[sx][sy]]]=; queue<int> q1; q1.push(belong[bh[sx][sy]]); js[belong[bh[sx][sy]]]=; while(!q1.empty()) { int x=q1.front();q1.pop(); rd[x]=; if(x==belong[bh[tx][ty]])continue; ;i=road[i].next) { int y=road[i].to; if(dis[y]>dis[x]+road[i].l) { dis[y]=dis[x]+road[i].l; js[y]=; js[y]+=js[x]; if(!rd[y]) { q1.push(y); rd[y]=; } } else if(dis[y]==dis[x]+road[i].l) js[y]+=js[x]; } } } int main() { scanf("%d%d",&n,&m); ;i<=n;i++) { ;j<=m;j++) { zz1++; bh[i][j]=zz1; scanf("%d",&c[i][j]); c2[zz1]=c[i][j]; ) sx=i,sy=j; ) tx=i,ty=j; } } zy[][]=-,zy[][]=-; zy[][]=,zy[][]=-; zy[][]=,zy[][]=; zy[][]=-,zy[][]=; zy[][]=-,zy[][]=-; zy[][]=,zy[][]=-; zy[][]=-,zy[][]=; zy[][]=,zy[][]=; ;i<=n;i++) { ;j<=m;j++) { ;k<=;k++) { )continue; ],ty=j+zy[k][]; if(!check(tx,ty))continue; ; )cj=; build2(bh[i][j],bh[tx][ty],cj); } } } ;i<=n;i++) { ;j<=m;j++) { )continue; if(!rz2[bh[i][j]]) tar(bh[i][j]); } } ;i<=n;i++) { ;j<=m;j++) { )continue; int t=bh[i][j]; ;k=road2[k].next) { int y=belong[road2[k].to]; if(y!=belong[t]&&!lt[belong[t]][y]) { lt[belong[t]][y]=; build3(belong[t],y,road2[k].l); } } } } memset(lt,,sizeof(lt)); ;i<=zz4;i++) { ;j=road3[j].next) { int y=road3[j].to; ) { ;k=road3[k].next) { int z=road3[k].to; if(z!=i&&!lt2[i][z]) build(i,z),lt2[i][z]=; } } else if(!lt[i][y]) build(i,y),lt[i][y]=; } } spfa(); ]) printf("-1\n"); else printf(,js[belong[bh[tx][ty]]]); ; }
9.18考试 第三题chess题解的更多相关文章
- 9.5 考试 第三题 奇袭题解(codeforce 526f)
问题 C: 奇袭 时间限制: 1 Sec 内存限制: 256 MB 题目描述 由于各种原因,桐人现在被困在Under World(以下简称UW)中,而UW马上 要迎来最终的压力测试——魔界入侵. 唯 ...
- bzoj 2752 9.20考试第三题 高速公路(road)题解
2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1545 Solved: 593[Submit] ...
- Lyft Level 5 Challenge 2018 - Final Round (Open Div. 2) (前三题题解)
这场比赛好毒瘤哇,看第四题好像是中国人出的,怕不是dllxl出的. 第四道什么鬼,互动题不说,花了四十五分钟看懂题目,都想砸电脑了.然后发现不会,互动题从来没做过. 不过这次新号上蓝名了(我才不告诉你 ...
- NOIP 2008提高组第三题题解by rLq
啊啊啊啊啊啊今天已经星期三了吗 那么,来一波题解吧 本题地址http://www.luogu.org/problem/show?pid=1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们 ...
- Codeforces Round #524 (Div. 2)(前三题题解)
这场比赛手速场+数学场,像我这样读题都读不大懂的蒟蒻表示呵呵呵. 第四题搞了半天,大概想出来了,但来不及(中途家里网炸了)查错,于是我交了两次丢了100分.幸亏这次没有掉rating. 比赛传送门:h ...
- PYC#1欢乐赛第三题题解
这里是比赛地址:http://tieba.baidu.com/p/2859693237,果然参赛神牛汇集. 第三题题目大意如下: 已知n条二次函数曲线Si(x)=aix^2+bix+ci(ai> ...
- 【LOJ6067】【2017 山东一轮集训 Day3】第三题 FFT
[LOJ6067][2017 山东一轮集训 Day3]第三题 FFT 题目大意 给你 \(n,b,c,d,e,a_0,a_1,\ldots,a_{n-1}\),定义 \[ \begin{align} ...
- [考试]NOIP2015模拟题2
// 此博文为迁移而来,写于2015年7月22日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w72i.html 1.总 ...
- Java-集合-第三题 有如下Student 对象, private String name; private int age; private int score; private String classNum; 其中,classNum 表示学生的班号,例如“class05”。 有如下List List list = new ArrayList(); l
第三题 有如下Student 对象, private String name; private int age; private int score; private String classNum; ...
随机推荐
- Win8 Metro(C#)数字图像处理--2.70修正后的阿尔法滤波器
原文:Win8 Metro(C#)数字图像处理--2.70修正后的阿尔法滤波器 /// <summary> /// Alpha filter. /// </summary> / ...
- qt中文编码(好多方法)
qt中文编码 来源:http://www.cublog.cn/u1/59481/showart_1947231.html 前些日子,被编码折磨了一段时间,总结一下Qt中的编码. [Qt 编码简单实验] ...
- window8 飘带与页面切换效果
演示效果如下 用鼠标点击滑动试试就能看到效果了 ^_^ iscroll 不仅可以做到自然滚动条的效果,看官方文档还可以用来做页面切换的效果,很好很强大. 所以我结合流行的飘带元素做了个简单的例子.. ...
- Qt - 设置程序界面风格(现成的QMacStyle等等)
类的继承关系: QMotifStyle:OSF(开放基金协会)开发的一个工业标准的GUI(图形用户接口): QCDEStyle:公共桌面环境(Common Desktop Environment)的缩 ...
- mouseover和mouseout事件引发的BUG-解决方法
mouseover和mouseout引发的BUG原由 当给一个元素添加mouseover或mouseout事件,这个元素还有子元素. 由于子元素的事件冒泡,鼠标移入或移出子元素都会触发事件. 解决的方 ...
- 抓取报表ALV GRID上的数据
在项目开发过程中需要从标准报表MB5B中获取数据,以下是本人实例中的相关部分,程序同样适用于获取其他标准报表的数据. CL_SALV_BS_RUNTIME_INFO=>SET( DISPL ...
- ngnix 安装
1安装PCRE库 ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ 下载最新的 PCRE 源码包,使用下面命令下载编译和安装 PCRE 包: ...
- python中的函数名,闭包,迭代器
一.函数名 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量,单纯print()出的是一个内存地址. def func(): print('你说你有点难追') print(func ...
- ansible(二)
一.软件相关模块 1.yum(下载包) 正常操作 yum 与rpm的区别 yum可以解决依赖关系rpm 全称readhat package manager(红帽包管理工具),需要自己解决依赖 yum源 ...
- JAVA命令运行cmd命令得到的结果乱码Runtime.getRuntime().exec("");
Process process = Runtime.getRuntime().exec("cmd /c dir c:"); BufferedReader bufferedReade ...