「题解」Lcyz 2022/10/23 模拟赛
A 猴猴吃苹果
赛时:暴力,Yyc 长剖 AC Orz
描述
给定一个 \(n\) 个结点的无根树,每个点的点权初始为 \(1\)。猴猴站在 \(k\) 号结点。
猴猴每次可以选择走到一个到当前结点经过的简单路径上点权和最大的结点,并将该结点到当前结点经过的简单路径上点权置为 \(0\)。求猴猴每次的选择。
思路
四道题中最难的。
直接搬来原题解罢。
- 对整棵树做 DFS,记录结点深度。
- 按照结点深度及编号对结结点排序,深度越大排序越靠前,深度相同时,编号小的排在前面。
- 按照排好序的结点顺序,逐个处理结点,从叶子结点向上走到父结点,并对已走过的结点标注为已访问。直到走到某个已访问的结点或者根结点后停止,记录走过的步数。
- 按照走过的步数及编号,对结点做第二次排序,得到的结果即为答案。
B 猴猴吃香蕉
赛时:正解,MLE,被 map 坑惨了
描述
给定长度为 \(n\) 的序列,求从中选出若干个数,求乘积为 \(k\) 的方案数。多次询问。
思路
设 \(f[i][j]\) 表示从前 \(i\) 个数中选出若干个乘积为 \(j\) 的方案数。\(f[0][1]\) 为 \(1\),表示什么都不选。
考虑第 \(i\) 个数选不选。
- 如果不选,\(f[i][j]=f[i-1][j]\)。
- 如果选,\(f[i][j]=f[i-1][\dfrac{j}{a_i}]\),前提是 \(a_i\mid j\)。
\(j\) 只需要是 \(k\) 的因数,单次询问时间复杂度 \(\mathcal{O}(n\cdot d(k)\cdot\log d(k))\),\(d(x)\) 为 \(x\) 的因数个数。
C 猴猴的比赛
描述
给定两棵树,定义二元组 \((x,y)\),\(x\) 是 \(y\) 的祖先。求这样满足条件的二元组个数。
思路
考虑在第二棵树上枚举 \(y\),将第二棵树上 \(y\) 到根经过的结点在第一棵树上标记,问题转化为求第一棵树上 \(y\) 的祖先中被标记的点的个数。
确定第一棵树上结点的 DFS 序,树状数组维护区间修改,单点查询。
D 繁繁的游戏
描述
\(n\) 个结点,两个结点之间有边表示这两个结点点权的差值不超过 \(k\),最大化最大权值减最小权值。
思路
将边权视为 \(1\),对该图任意两结点求最短路,即最小约束,答案即为所有两点间最短路最大值 \(\times k\)。