2018 Multi-University Training Contest 2
2018 Multi-University Training Contest 2
C - Cover
题目描述:给定一个图(不一定联通),用最少的的欧拉路径或欧拉回路覆盖,输出方案。
solution
一个个联通块处理,对于一个联通块(如果只有一个点,那就可以忽略了),一定有偶数个度数为奇数的点(设为\(k\)个),将这些点每两个配对连边,走一次欧拉回路,然后将这些边删掉,就可以分成\(max(k/2, 1)\)路径,而这就是最优的。
时间复杂度:\(O(n)\)
D - Game
题目描述:在集合里有\(n\)个元素(\(1\)~\(n\)),两个人玩游戏,每次从集合里面选一个数,然后将他的所有约数从集合里删掉,谁不能选数,谁就输。问先手是否必胜。
solution
\(1\)是一个非常特殊的数,因为无论删什么数,都会删\(1\)。如果先手不删\(1\)有必胜策略,则必胜,如果必败,则删\(1\),把败局扔给后手,必胜,所以先手必胜。
时间复杂度:\(O(1)\)
E - Hack It
题目描述:有一个\(n \times n\)的方阵,每一个是\(0\)或\(1\),现在有一个算法来判断这个方阵是否存在一个子矩阵,它的四个角都是\(1\),所在要构造一个\(n \leq 2000\)的方阵,使得里面有至少\(85000\)个\(1\),但满足条件的子矩阵不存在。
solution
令\(n=p^2,p\)是质数,这里\(p=47\),然后这个方阵由\(p^2\)个\(p^2\)的方阵组成,现在要填数进去,使得任意两行至多只有一列都有\(1\)。
对于\(k, b, i<p, a[kp+b][ip+(ki+b)\%p]=1\)
设\(k_1 \neq k_2\),假设\(ip+(k_1i+b)\%p=ip+(k_2i+b)\%p\)(不可能左边是\(i\),右边是\(j\)),判断是否存在\(j\)也满足等式,假设\(jp+(k_1i+b)\%p=jp+(k_2i+b)\%p\),两式相减,则
\((i-j)k_1=(i-j)k_2 (modp)\),因为\(p\)是质数,且\(k_1 \neq k_2\),因此等式不成立,所以不存在\(j\)也满足等式,即没有两列同有\(1\)。
因此这种构造是对的,只要取前\(2000 \times 2000\)的矩阵即可。
时间复杂度:\(O(p^4)\)
F - Matrix
题目描述:有一个\(n \times m\)的矩阵,每个格子要么是黑色,要么白色,问有多少种方案使得至少有\(A\)行黑色,\(B\)列黑色。
solution
这个题解说得挺详细的,但按着那里说的貌似答案不对。
G - Naive Operations
题目描述:给定一个\(n\)排列\(B\),有一个长度为\(n\)的序列\(A\),初始全都为\(0\),现在有两种操作:1、给\(A\)的一个区间全部加\(1\),2、询问一个区间的\(\left \lfloor \frac{a_i}{b_i} \right \rfloor\)的和
solution
有两种做法:
1、用线段树维护对于区间\([L, R]\),要加多少次\(1\)才能使区间里的一个数的答案加\(1\),一旦存在就从该点往下更新答案。
2、离线处理所有的加操作,按左端点从小到大排序,用线段树求出每个位置的数在哪里次加操作后答案加一,然后再按时间顺序进行正常操作。
时间复杂度:\(O(nlog^2n)\)
J - Swaps and Inversions
题目描述:对一个序列进行操作,操作后的总花费为序列的逆序对个数乘\(x\),而进行一次操作需要花费\(y\),操作是交换相邻两个数。
solution
交换相邻两个数可以消除一个逆序对,因此答案等于逆序对个数乘\(min(x, y)\)
时间复杂度:\(O(nlogn)\)