牛客多校2020第二场补题
F Fake Maxpooling
题意
规定矩阵对应的值为其下标的 $lcm$ ,求所有 $k * k$ 子矩阵最大值之和。 $( n,m,k = 5000 )$
Solution
线性求 $lcm$ + 二维单调队列
线性求 $lcm$ :
1 | for (int i = 1; i <= n; i++) |
先对每一行进行单调队列(滑动窗口)维护出最大值矩阵 $g$ ,再对列进行单调队列维护矩阵 $g$ 的最大值即可。
Code
1 |
|
C Cover the Tree
题意
给定无根树,用最少的链覆盖树的所有点。 $( n = 2e5 )$
Solution
思维 + dfs序
首先不难想到所取的链两个端点都在叶子上才会是最优的,因此答案应为 $(叶子结点数 + 1)/2$ 。
经过一番玄学证明,得到结论为按 dfs序 构造链会是最优的,任取非叶子结点为根,由 dfs序 得到叶子结点 $l1, l_2 ….l_x$ ,然后将 $l_1$ 与 $l{x/2+1}$ 构成链以此类推,若多出一个点,则与根结点连起来即可。
Code
1 |
|
B Boundary
题意
已知一个圆必过点 $(0,0)$ ,需要构造该圆使得尽可能多的给定点在该圆的边界上,问最多能有几个点。 $( n = 2000, |x,y| = 100000 )$
Solution
三个点可以确定一个圆,因此不妨枚举两个点,求出圆心,圆心重合次数最多的即为答案。
Code
1 |
|
J Just Shuffle
题意
一个排列经过质数次置换后得到排列 A ,求原排列。 ( n = 1e5 )
Solution
直接拍个置换开根板子就过了。。。
Code
1 |
|