A – Pay to Win
一个 DP。考虑反向构造:从 \(0\) 到 \(X\)。最后过程肯定是先加加减减然后再除、亦复如是。
继续阅读“AtCoder Grand Contest 044 – 解题报告”Personal Blog
一个 DP。考虑反向构造:从 \(0\) 到 \(X\)。最后过程肯定是先加加减减然后再除、亦复如是。
继续阅读“AtCoder Grand Contest 044 – 解题报告”树的结构让某些数据难以直接快速合并,所以就有了树上启发式合并,一种把合并时间为\(O(n)\)优化成\(O(\log n)\)的神奇方式。如果您先前学习过树链剖分,那么学习树上启发式合并就非常简单了。
一眼可以了解到是一道割点题。对于不是割点的情况,那么被计算的点对一定包含此点本身,又因为有序,所以贡献就是\(2(n – 1)\)。如果是割点的话,就比较麻烦,分下面几个来算:
第一个很好算,是\(2(n – 1)\)。第二个,在 Tarjan 枚举搜索子树的时候计算子树大小和全图补集的乘积(注意,这里会多计算一遍与点\(u\)的点对,所以我们第一个改成算\(n – 1\));第三个,算「当前整颗搜索树与图的补集大小」与「搜索树的大小」的乘积。
综合起来就是,对于点\(u\):
\[ ans_u = \sum_{k \in son(u)} (n – size(k)) \times size(k) + (n – 1) + (n – 1 – \sum_{k \in son(u)} size(k)) \times (1 + \sum_{k \in son(u)} size(k)) \]
首先发现\(k\)非常的小,且\(n\)也较小,所以考虑直接暴力,枚举经过每一个超市的顺序,然后顺起来就行了(提前处理\(k\)次最短路即可)。