Educational Codeforces Round 36
Educational Codeforces Round 36
A. Garden
题目描述:给定\(n\)个数,找出能整除\(m\)的最大的数(假设是\(num\)),输出\(\frac{m}{num}\)。
solution
枚举。
时间复杂度:\(O(n)\)
B. Browser
题目描述:有\(n\)个标签页,当前在第\(i\)页,有下面六个操作:
- 向左移动一个页面,即\(i-1\)
- 向右移动一个页面, 即\(i+1\)
- 关闭左边一个页面,即第\(i-1\)个页面
- 关闭右边一个页面,即第\(i+1\)个页面
- 关闭左边所有页面,假设左边最近一个已关闭的页面为\(L\),则关闭\(L+1\)到\(i-1\)的页面。
- 关闭右边所有页面,假设右边最近一个已关闭的页面为\(R\),则关闭\(i+1\)到\(R-1\)的页面。
标签页删除后保持原来的编号。问最少多少个操作使得最后只剩下\([x, y]\)的标签页。
solution
贪心。最好肯定是移到\(x\)和\(y\)然后把\(x\)左边和\(y\)右边删除,但要仔细判断是否要删,删左边还是右边比较快。
时间复杂度:\(O(1)\)
C. Permute Digits
题目描述:给出两个数字\(A, B\),将\(A\)的数字重新排列,得到一个不超过\(B\)的最大的数,输出那个数。
solution
搜索。从高位开始与\(B\)匹配,如果存在与该位相同的数字,则取该数字,否则取比该数小的最大的数,若没数,则回溯继续搜索。若在某一位取了小于\(B\)对应位的数,那剩下的数字从大到小输出即可。
时间复杂度:\(O(18)\)
D. Almost Acyclic Graph
题目描述:给出一个有向图,问是否能最多删去一条边,使得剩下的图是有向无环图。
solution
找出任意一个环,尝试把环中的边一一删去,看剩下的是否是有向无环图,若是则输出YES。如果都不行,则说明这个环始终存在(若不删这个环的边),输出NO
时间复杂度:\(O(n^2)\)
E. Physical Education Lessons
题目描述:有\(n\)天,开始时每天都是工作日,接下来有\(q\)个修改,每个修改会把\([x, y]\)变成工作日或非工作日,求出每次修改后的工作日天数。
solution
先离散化,然后用线段树维护。
时间复杂度:\(O(qlogq)\)
F. Imbalance Value of a Tree
题目描述:给出一棵有点权的树,求出所有路径的最大值减最小值的差的和。
solution
所有路径的最大值减最小值的差的和等价于所有路径的最大值的和减所有路径的最小值的和。
考虑所有路径最大值的和。将点按点权从小到大排序,假设当前到了第\(i\)个点,前面的点用并查集维护连通性并记录每个联通块的点数。假设\(j\)与\(i\)相连且\(j\)排在\(i\)的前面,因\(i\)是当前的最大值,且\(j\)连通块的点到\(i\)连通块的点必定经过\(i\),所以\(j\)连通块的点到\(i\)连通块的点的路径的最大值为\(i\),更新答案,然后将\(i\)连通块与\(j\)连通块合并为\(i\)连通块,对所有满足条件的\(j\)进行操作。最后就能算出所有路径最大值的和。
同理,将点按点权从大到小排序,用同样的方法进行操作,就能求出所有路径最小值的和。求出所有路径最大值的和与所有路径最小值的和的差即是答案。
时间复杂度:\(O(nlogn)\)
G. Coprime Arrays
题目描述:将\(n\)个数\(a_i\)称为既约系当且仅当\(gcd(a_1, a_2, ..., a_n)=1\)。给出两个数字\(n, k\)。对于\(i(1 \leq i \leq k)\),计算出满足\(1 \leq a_j \leq i (1 \leq j \leq n)\)的既约系\(a_i\)的个数,答案模\(10^9+7\)。假设每个\(i\)的答案为\(b_i\),输出\(\sum_{i=1}^{k}(b_i XOR i) mod (10^9+7)\)。
solution
对于每个\(i\),\(b_i\)可用容斥原理来算。设\(f(x)=x^n\), 则\(b_i=\sum_{S} (-1)^{|S|}f(\left \lfloor \frac{i}{S} \right \rfloor)\),其中\(S\)为小于等于\(i\)的质数的子集。如果把\(S\)换为\(j(1 \leq j \leq i)\),考虑每个\(j\)对\(b_i\)的贡献,发现系数是莫比乌斯函数。即
对于每个\(j\),只有\(j|i\)时,\(\left \lfloor \frac{i}{j} \right \rfloor\)会改变,所以可以设一个数组\(g[i]\),枚举\(j\),\(g[kj]+=\mu(j) (f(k)-f(k-1))\),然后\(g\)的前缀和便是\(b_i\)。
时间复杂度:\(O(nlogn)\)