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
eq 1), 则(varphi(x)
eq 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),求
的期望值。
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^3sqrt{k}+qn))