2021牛客多校第二场复盘
条评论前言
被各路神仙暴打。
有一说一,周五周日牛客多校,周二周四杭电多校,确实很让人吃紧(
看群友们好像两边都坚持打,而且补题也补得很快(
复盘
C - Draw Grids
签到题。读完题就可以写了,大概就是模拟一下生成树。
1 | /* vegetable1024 | oi-liu.com | Maybe Lovely? */ |
D - Er Ba Game
同样是签到题,模拟题意就可以了。
1 | /* vegetable1024 | oi-liu.com | Maybe Lovely? */ |
F - Girlfriend
计算几何,本质上是计算球缺的体积。
或许可以用积分推公式…不过用网上的球缺体积板子过掉了…
1 | /* vegetable1024 | oi-liu.com | Maybe Lovely? */ |
I - Penguins
大模拟,其实还是蛮好写的。
1 | /* vegetable1024 | oi-liu.com | Maybe Lovely? */ |
J - Product of GCDs
欧拉降幂$Get$
这道题难点应该主要在于如果推断一个数在$Gcd$中的贡献,官方题解使用了一个很巧妙的办法:
考虑统计每个素因子的贡献。
首先欧拉筛求出范围内的素数,然后枚举素数以及素数次幂的倍数
在原序列中的出现次数。
更具体的对每一个$p^k$的倍数,若其出现在序列中,则计数器$c=c+1$,枚举完$p^k$的每一倍数后,若$c \geq k$,则说明可以选择$(_k^c)$个集合,能够贡献的$gcd$为$p^k$。
但是,在$k$较小时,$p^k$的倍数可能与较大的$p^k$相重复。
不过,我们把目标放在求$p^1$的贡献,就不用在乎重复的问题了。此时只需要将所有不同的$k$的$p^k$的结果加起来得到$res$,再计算$p^{res}$。
即:
1 | for(int i = 1; i <= s; i++) |
由于$sum$可能很大,我们使用欧拉降幂即可。
完整代码如下:
1 | /* vegetable1024 | oi-liu.com | Maybe Lovely? */ |
K - Stack
题意大概是给出一个单调栈,和$k$个时刻的单调栈的$size=b_{p_i}x_i$。问能不能构造一个入栈序列${a_i}$(同时也是一个排列)满足题目所给的条件。
学习了一种很妙的构造方法。
每次我们贪心的构造尽可能长的单调序列,这样才能更容易满足$len \geq size$的条件(弹出到$len=size$为止),同时对未给定的$b[i]$进行填充(当前的序列长度)。
而后,我们用一个$cnt$数组,统计每个长度出现了多少次,用于构造答案。
最后对$cnt$数组做一个前缀和,保证每个单调序列不会冲突。
1 | /* vegetable1024 | oi-liu.com | Maybe Lovely? */ |