2016 Multi-University Training Contest 1 solutions BY HIT

首先向大家表示抱歉,因为这套题是去年出的,中间间隔时间太长,今年又临时准备仓促, 所以部分题目出现了一些问题,非常抱歉。

Abandoned country

首先注意到任意两条边的边权是不一样的,由此得知最小生成树是唯一的,最小生成树既然 是唯一的,那么期望其实也就是唯一的,不存在什么最小期望。求完最小生成树之后,接下 来的问题就可以转换成在最小生成树上求任意两点之间距离的平均值,对于每条边,统计所 有的路径用到此边的次数,也就是边的两端的点数之积。那么这条边的总贡献就是次数*边 权。最后得到所有边的贡献之和再除以总路径数\(n*(n-1)/2\)就是答案。可以\(On\)求出。任取一点为根dfs,对每个点\(i\)记录其子树包含的点数(包括其自身),设点数为\(sum[i]\),则\(i\)的父亲一侧的点数即为\(n-sum[i]\)。一边遍历一边统计就行。

Chess

简单的博弈,要预处理出所有状态的Sg值,因为列为固定的20,所以状态压缩后可以存下 所有状态。

Game

题目要求出所有合法点对间的最短路径的平均值,因此我们应当求出所有合法最短点对的最 短路径之和,再除以合法点对个数。 题目中Guard之间有着很不自然的制约关系,每个Guard的周围和同行、列都不能有其余的 Guard,但不可路过的格子却只有本身一格。由此发现,任意两点间的最短路径只会至多被 一个Guard所干扰。 因此可以想到,我们可以先算出没有Guard制约的所有最短路径长度之和,再分别对于每个 Guard求出它对最短路径长度的贡献(即原本必须经过它的最短路要多绕两格)。

GCD

我们注意观察\(gcd(a_{l},a_{l+1},...,a_{r})\),当l固定不动的时候,\(r=l...n\)时,我们可以容易的发现,随着\(r\)的増大,\(gcd(a_{l},a_{l+1},...,a_{r})\)是递减的,同时\(gcd(a_{l},a_{l+1},...,a_{r})\)最多 有\(log\ 1000,000,000\)个不同的值,为什么呢?因为\(a_{l}\)最多也就有\(log\ 1000,000,000\)个质因数

所以我们可以在log级别的时间处理出所有的以L开头的左区间的\(gcd(a_{l},a_{l+1},...,a_{r})\) 那么我们就可以在\(n\ log\ 1000,000,000\)的时间内预处理出所有的\(gcd(a_{l},a_{l+1},...,a_{r})\)然后我们可以用一个map来记录,gcd值为key的有多少个 然后我们就可以对于每个询问只需要查询对应\(gcd(a_{l},a_{l+1},...,a_{r})\)为多少,然后再在map 里面查找对应答案即可.

Necklace

其实就是一个阴阳宝石怎么交错摆放的问题,很容易想到通过DFS去搜索枚举,但是直接阴 阳交错搜索的话,时间复杂度太高,并且不容易通过估算估计代价去剪枝。 因此我们首先选取一种宝石(假设为阴),枚举所有的摆放情况,之后再依次枚举插入另一 种宝石(假设为阳),由于阴宝石己摆放好,则当前方案总代价就能有一个比较粗略但很有 效的估计:也就是每次枚举所有未插入的阳宝石,依次去插入到每一个空位中,只要存在一 个可以使其光泽变暗的空位,则认为它的光泽会变暗,由此可以得到一个当前方案的估计代 价,再采用此代价进行剪枝即可。

PowMod

考虑由于\(\varphi (i)\)是积性函数,因此我们对于每个质因子求出其贡献即可。

考虑\(n\)的某个质因子\(p\),我们设\(sum(n,m)=\sum_{i=1}^{m} \varphi (i*n)\).那么考虑将质因子\(p\)的贡献单独处 理,可以得到\(\varphi (i*n) = \varphi (p) * \sum _{i=1}^{m} \varphi (i* \frac{n}{p}) + \sum_{i=1}^{m/p} \varphi (i*n)\).

因此可以利用\(sum(n,m) = \varphi (p) * sum(\frac {n}{p},m) + sum(n,\frac{m}{p})\)来递归地计算k.

最后可以利用\(a^{b}\%p = a^{\varphi (p) + b\%\varphi (p)}\),递归地计算\(k^{k^{k^{\cdots ^{k}}}}\)

Rigid Frameworks

原问题等价于求左边有n个点,右边有m个点的联通的二分图的数目 可以用类似连通图计数的方法dp得到,复杂度\(O(n6)\)

实际上是 projecteuler 434

Shell Necklace

\(f[i]\)表示装饰前\(i\)个的代价,那么\(f[i] = \sum_{j=1}^{i} f(i-j)*a[j]\)。直接计算是\(n^{2}\)的,观察这个式子,显然符合\(fft\)的形式,所以用分治\(fft\)优化即可。

Solid Dominoes Tilings

回忆多米诺骨牌完美覆盖。

显然我们可以轮廓线DP。

swap(p, q); f[p].clear(); foreach(it, f[q]) {

    d = it->se;

   ints= it->fi;

if(j && !_1(s, j) && _1(s, j-1))

{

      f[p][s"_1(j-1)] += d; // 横着放

      f[p][s二1(j)] += d; // 竖着放或不放...

}

} 稍加修改可以支持障碍以及空隙。

swap(p, q); f[p].clear(); foreach(it, f[q]) {

d = it->se; ints = it->fi;

if(buf[i1][j] != ’.’){

if(!_1(s, j)) f[p][s] += d; // 有障碍、必须不放

}

else{

if(j != j0 && !_1(s, j) && _1(s, j-1) && buf[i1][j-1]=='.')

f[p][s二1(j-1)] += d; // 横着放

if(!_1(s, j)){ //是否没被覆盖

f[p][s] += d; // 不放

f[p][s二1(j)] += d; // 竖着放

}

else{

f[p][s二1(j)] += d; // 不放

}

}

}

。。。剩下只需要考虑solid的问题。。。

方法一:加维,复杂度太高。不适用这个题

方法二:容斥原理。

我们用上述方法先预处理不考虑分割线的状态。我们对列用容斥原理,枚举列上分割线的状态。

在用递推处理行分割的情况,复杂度\(O(n\ 2^{m})\)

Subway

这个题是一个树的同构判断,想办法用一个和节点顺序无关的哈希函数将树表示出来即可。 这里提供一种方法:首先求解树的中点,然后将中点作为根。只有一个结点的子树哈希值为 1。选一个比较大的质数P和一个特别大的质数Q。对于每一颗树,把它的所有子树的哈希 值排序。然后\(hash=sum(P^{i}*hash[i])\%Q\),就能算出来总体的哈希值。有两个中点的树两个 中点都试一下。为了保险可以检查下哈希值有没有重的。

tetrahedron

设四个点是A、B、C、D ,那么内切球的圆心可以表示为 $\frac{ \begin{Vmatrix}(b-a)\times (c-a)\end{Vmatrix}\times d+\begin{Vmatrix}(b-a)\times (d-a)\end{Vmatrix}\times c + \begin{Vmatrix}(c-a)\times (d-a)\end{Vmatrix}\times b +\begin{Vmatrix}(c-b)\times (d-b)\end{Vmatrix}\times a }{ \begin{Vmatrix}(b-a)\times (c-a)\end{Vmatrix}+ \begin{Vmatrix}(b-a)\times (d-a)\end{Vmatrix} + \begin{Vmatrix}(c-a)\times (d-a)\end{Vmatrix} + \begin{Vmatrix}(c-b)\times (d-b)\end{Vmatrix}} $

半径$r =\frac{ \begin{Vmatrix} a_{x} & a_{y} &a_{z} & 1\ b_{x} & b_{y} &b_{z} & 1\ c_{x} & c_{y} &c_{z} & 1\ d_{x} & d_{y} &d_{z} & 1 \end{Vmatrix} }{ \begin{Vmatrix}(b-a)\times (c-a)\end{Vmatrix}+ \begin{Vmatrix}(b-a)\times (d-a)\end{Vmatrix} + \begin{Vmatrix}(c-a)\times (d-a)\end{Vmatrix} + \begin{Vmatrix}(c-b)\times (d-b)\end{Vmatrix}} $

posted @ 2016-08-16 19:42  多校博客  阅读(437)  评论(0编辑  收藏  举报