2018 Multi-University, HDU Day 7
Problem A
Solved by kblack. 01:47 (+2)
题意:给一个边上带颜色的无向图,走的边颜色变化一次花 1,求最短路。
题解:边上加个点,到两个端点距离为 1,一个点出去的同色边缩一下,因为距离都是 1,跑 bfs 就好了,卡常。。。
Problem B
Solved by ultmaster. 04:56 (+4)
题意:由 a 个 A,b 个 B,c 个 C 为周期的字符串,现在给出 $m$ 个位置的信息,让你反求 $(a,b,c)$,要求字典序最小。
题解:(跟官方题解完全不一样)首先枚举周期 $p$,我们要对 ABC 分别求模 $p$ 下最小的位置和最大的位置。朴素暴力会超时。考虑使用 bitset 优化(去年多校套路),按照 2 的幂,只需要 log 次合并即可。但问题是需要查最低位(bitset 有)和最高位(bitset 霉有)。于是需要自己实现一个 bitset。发生了一系列错误,勉强 AC。
另解:把 A,B,C 存在三个 vector 里,然后二分搜索即可。代码短一倍,而且非常好写。
左移 64 位会出现未定义行为,一定要小心!Reference
Problem C
Upsolved by zerol.
题意:支持以下操作
123 操作都是往一个集合中放入一个时间戳为 t 的对栈的操作
1. push v
2. delete v (删除最靠近栈顶的 v)
3. pop (不超过 5 次)
4. 对于给定的 t,把所有时间戳不超过 t 的操作按时间戳对一个空栈顺序执行,回答顶部元素。
v 不超过 5,操作保证合法,时间戳各不相同。
题解:对于每个 v 单独维护栈,询问栈顶就比较一下所有栈的栈顶的时间戳。pop 操作就相当于把询问的栈顶元素删掉。所以询问时依次考虑不超过 t 的 pop,每次删掉栈顶元素,最后回答栈顶元素,然后回滚这些删除操作。对于每个 v,开一棵线段树,维护某个时间点栈内的元素个数。如果询问某个时刻 t 前操作的栈顶元素的时间戳,设该时刻的栈内元素个数是 x,那么答案就是不超过 t 的尽可能大的栈内元素个数恰好是 x - 1 的时间戳 +1。为了求这个东西,首先将 [1,t] 区间在线段树上分解成不超过 log 个区间,然后从右往左考虑,如果这个区间内的最小值不超过 x - 1,那么一定能在这个区间内找到答案,所以多维护一个最小值就好了。
Problem D
Upsolved by kblack. (-2)
题意:$n$ 辆公交车,均匀概率地在一个时间点前到,如果 $T_i$ 还没到,就走路,公交车时间 $a$ 保证小于走路时间 $b$,求期望到家时间。
题解:两个部分,设 T 为最后等待的时间,最后走路的概率 $p = \prod_{i=1}^{n}{(1-\frac{min(L_i, T)}{m})}$,则假设公交也最后才开的期望时间为 $p \times (b+T) + (1-p) \times (a+T)$,然后减去公交车之前开的概率,这部分是$ \int_0^T {(1-\prod_{i=1}^{n}(1-\frac{min(L_i, t)}{m}))} dt$,这个要积的玩意儿是分段函数,最多分 $n$ 段,正确积分即可。
Problem E
Solved by ultmaster. 00:57 (+1)
题意:求 $\sum_{i=1}^m \sum_{i=1}^n \frac{\phi(ab)}{\phi(a) \phi(b)}$。
题解:$\frac{\phi(ab)}{\phi(a) \phi(b)} = \frac{\text{gcd}(a,b)}{\phi(\text{gcd}(a,b))}$。然后枚举 gcd,后面就是一个互质数对数经典的计数,反演即可。
Problem F
Problem G
Problem H
Solved by ultmaster. 01:41 (+)
题意:给一个基环外向树,两种询问:改边权,求两点最短距离。
题解:把多的那条边拿出来分开考虑,剩下的就是一棵树。然后最短距离要么就是在树上走的,要么就一定经过那条边。两种情况讨论一下,剩下的就是一个 树链剖分 + 线段树经典套路。
Problem I
Solved by zerol. 01:26 (+1)
题意:给一棵树,每个点上都有一个标记,表示向上跳几步。要求支持:1. 修改标记的值。2.询问从 u 开始连续跳,直到跳出树外需要的步数。
题解:每个点向上跳若干步跳到的位置可以用倍增或树剖查询。如果每个点向能一次跳到的点连边,那么这就是一棵树(还需要加一个点表示树外)。那么问题就转化成了换父亲,询问链上的距离。这部分用 LCT 维护,因为要询问距离需要维护一个 size。
Problem J
Solved by kblack. 00:43 (+1)
题意:$\left\{\begin{eqnarray*} F_1 &=& A \\ F_2 &=& B \\ F_n &=& C\cdot{}F_{n-2}+D\cdot{}F_{n-1}+\left\lfloor\frac{P}{n}\right\rfloor \end{eqnarray*}\right.$ 给定 A, B, C, D, P, n 求 $F_n$。
题解:$\lfloor{\frac{P}{n}}\rfloor$ 只有 $\sqrt{P}$ 种,分段快速幂就好了,注意分段的间隔。
Problem K
Solved by zerol. 02:04 (+)
题意:有 k 维属性,对于每个怪物,如果每一维属性都大于等于它的话,就可以击败他,然后每一维属性都增长一个非负整数。求最后能击杀的怪的数量和最后属性值。
题解:怪物肯定能杀就杀。对于所有怪物,按照每一维从小到大排序,用 k 个指针维护当前这一维属性能被击败的怪并标记,一旦一个怪物被标记了 k 次就挂了。