2018 Multi-University Training Contest 2
A - Problem A. Ascending Rating
题目描述:给定一个序列,分别求出所有长度为\(m\)的区间的\(maxrating, count\),对于每个长度为\(m\)的区间,一开始\(maxrating=-1, count=0\),然后从左往右扫,扫到一个大于\(maxrating\)的值时,\(count+1, maxrating=\)那个数。
solution
从左往右做,用单调队列维护当前一段单调不上升的序列,当添加一个数进来时,删掉的数的下一个最大值就是新加进来的数,将下一个最大值看成父亲,用并查集维护,那么一个区间的答案就是区间左端点的根的值和到根的距离。每个数只会进队一次,退队一次,因此时间复杂度是\(O(n)\)
时间复杂度:\(O(n)\)
C - Problem C. Dynamic Graph Matching
题目描述:有\(n\)个点,有\(m\)次操作,每次操作要么加一条边,要么删一条边,求出每次操作后,对于所有的\(k\), 恰好\(k\)条边的匹配(即\(2k\)个点两个两个匹配)方案数。
solution
记\(f[sett]\)表示\(sett\)集合的点已匹配的方案数,加一条边\((u, v)\),就枚举除去\(u, v\)的集合,更新加上\(u, v\)的答案,删除类似。
时间复杂度:\(O(m2^n)\);
D - Problem D. Euler Function
题目描述:求出第\(k\)个欧拉函数是合数的\(n\).
solution
第一个是\(5\),第二个是\(7\),考虑\(n>7\)
令\(n=2^dx\),因为欧拉函数是积性函数,所以\(\varphi(n)=\varphi(2^d)\varphi(x)\)
若\(x=1\),则\(\varphi(n)=\varphi(2^d)=2^{d-1}\)合数
若\(x\neq 1\), 则\(\varphi(x) \neq 1\), 所以\(\varphi(n)\)合数
因此\(n>7\)的欧拉函数都是合数。
时间复杂度:\(O(1)\)
F - Problem F. Grab The Tree
题目描述:给定一棵树,树上有点权,每次\(A\)选一个点拿走,然后\(B\)把\(A\)选的点的邻点拿走,最后把整棵树拿走,每个人把拿走的点的权值异或起来,谁大谁赢,问在最优策略下,最终的结果。
solution
假设\(A\)的值是\(x\),则\(B\)的值为整棵树的值的异或和再异或\(x\),若整棵树的异或和为\(0\),则平手。否则将这棵树分层,会发现对于一种选取的方案,\(A, B\)选择的点是可以交换的,即交换后也是一种可行的方案,所以\(A\)必胜。
时间复杂度:\(O(n)\)
G - Problem G. Interstellar Travel
题目描述:把原本的题目等价于:当坐标相同时只保留编号较小的点,求字典序最小的凸壳。
solution
字典序最小的凸壳。
时间复杂度:\(O(n)\)
H - Problem H. Monster Hunter
题目描述:有一棵以\(1\)为根的有根树,除了根,每个点都有一只怪物,从根出发,遇到怪物时会先扣\(A_i\)血,再回\(B_i\)血,然后怪物消失,任何时刻的血量不能低于\(0\),问一开始至少要有多少血,才能打完所有怪。
solution
先不考虑打怪时要先打父亲才能打儿子。那肯定先打\(A_i<B_i\)的怪,对于\(A_i<B_i\)的怪,先打\(A_i\)小的。对于\(A_i \geq B_i\)的怪,考虑\(i, j\)两只怪兽,先打\(i\),则血量减小\(A_i+A_j-B_i\),先打\(j\),则血量减小\(A_i+A_j-B_j\),因此先打\(B_i\)大的。
假设求出来的攻击顺序为\(p_1, p_2, ..., p_n\)
若\(p_1\)没有父亲,则打\(p_1\)
否则在打完\(p_1\)的父亲后,紧接着打\(p_1\)最优,因此可以将\(p_1\)和父亲合并,将\(p_1\)的儿子的父亲改成\(p_1\)的父亲。
重复操作,每次操作都会少一只怪,所以只要按照打怪的规则维护一个堆,用并查集维护父亲。
时间复杂度:\(O(nlogn)\)
I - Problem I. Random Sequence
题目描述:给定一个序列\(a_i\),如果\(a_i=0\),则可以用\([1, m]\)中的数替换,再给定一个长度为\(m\)的数组\(v\),求
\[\prod_{i=1}^{n-3}v[gcd(a_i, a_{i+1}, a_{i+2}, a_{i+3})]\]
的期望值。
solution
\(f[i][j][k][p]\)表示到第\(i\)个数,前三个数的\(gcd=j\),前两个数的\(gcd=k\),前一个数的\(gcd=p\),然后枚举\(i+1\)是什么数,更新状态。因为\(gcd\)的原因,所以\(j|k, k|p\),因此状态数不多。
时间复杂度:\(O(能过)\)
L - Problem L. Visual Cube
题目描述:给出长方体的长宽高,输出这个长方体。
solution
找规律。
时间复杂度:\(O(边长^2)\)
M - Problem M. Walking Plan
题目描述:给定一个\(n\)个点,\(m\)条边的有向图,边有权值,\(q\)个询问,每次询问\(u\)到\(v\)至少经过\(k\)条边的最小值。
solution
分块,每走\(100\)步分一块,预处理出每两个点恰好走\(i\)步的最小值,至少走\(i\)步的最小值,然后\(100\)步\(100\)步地走,处理出恰好走\(100i\)步的最小值。询问时先整百地走,再加上至少走\(i\)步的最小值即可。
时间复杂度:\(O(n^3\sqrt{k}+qn)\)
原文地址:https://www.cnblogs.com/GerynOhenz/p/9498713.html