今天考的这一套试题比较全面。
题目难度大概是2、3、1
第二题:A+B
题目大意:定义一个Fibonacci表示序列,S = sigma( a[i] * fib[i] )。a序列的长度更长、或是从高位到低位字典序更小则更优。给出两个最优表示序列,求这两个数之和的最优表示序列。
这一道题的做法比较暴力,它是先将所有的二暴力地迭代消除后,暴力地迭代消除所有连续的1就好了,营养成分不是很高。
第三题:小路
题目大意:给出一幅DAG,求有多少个点对(u, v),存在两条从点1到点u和点v的路径,它们除点1外没有交点。
解决这一道题的核心思想是用 Dominator Tree(支配树),它维护的是一幅图从一个定点走到任意一个点的“必经点”。
某点x在Dominator Tree上的父亲是点x的“最近支配点”,也就是最近的必经点。
在DAG上建立这棵树的方法是比较简单的。以拓扑序遍历每个点,当前点x在Dominator Tree上的父亲就是x所有前驱在Dominator Tree上的LCA。
简单证明一下。假如我们已经得到了点x的所有前驱在Domiator Tree上的父亲,那么我们就知道了1到x的所有前驱的路径上的必经点。那么所有前驱的共同的最深的必经点,显然就是x的最近必经点。
求LCA可以动态地维护倍增数组。
显然1到某两个点的路径不重合,当且仅当它们在点1的不同子树上,简单地乘一下就好了。
第一题:迷宫
题目大意:给出一个四联通的格子图,每个各自上有一个该格为障碍的概率。求在生成一个存在一条从左上角到右下角的道路的迷宫的情况下,每个格子为障碍的概率。
这里要求一个条件概率。
根据概率论的知识,有
P ( A | B ) = P ( A ∩ B ) / P( B ) 或 P( A | B ) * P( B ) = P( A ∩ B ) 。 ( 这体现的是“整体”和“局部“的关系 )
对应的有P ( B | A ) = P ( A ∩ B ) / P( A ) 或 P( B | A ) * P( B ) = P( A ∩ B )
稍微变形有 P( A | B ) = P ( B | A ) * P( A ) / P( B ) ( 贝叶斯公式 )
于是这里生成一个好迷宫的前提下某个点为障碍的概率就可以转化成为某个点为障碍的前提下这个迷宫联通的概率。
简单地做一个联通性dp就可以解决这个问题了。