2024.11.25总结


A:

限制等价于位置 ii 的所有可能情况平均值均大于等于整体平均值,用个双指针模拟即可。

无解情况是不存在的。

B:

ii 使用优惠卷而 bb 未使用,若想让 ii 的优惠卷给 jj 用,需要满足 aibi<ajbja_i-b_i<a_j-b_j

然后我们每次找到一个原价/优惠价的最小值,与选择使用优惠卷的物品比较,判断是否替换即可。

C:

非常好NOIP模拟赛,使我默写lct

首先考虑一个实链x1,,xkx_1, \cdots, x_k(从浅到深),容易发现xkx_k一定是这kk个节点里最晚被操作的,其他的节点之间顺序随意。然后考虑x1x_1的父亲 yy 所在实链的链底 zzx1x_1 一定比 zz 早操作。于是可以建一棵树,非链底向对应链底连边,链底向父亲链的链底连边,这样每个点在新树上的父亲的操作顺序一定比当前点早。

于是变成了这个问题:有一颗树,求有多少排列满足Px<PfaxP_x < P_{fa_x}。这个问题可以简单的树形 dp 得到一个式子 n!sizeu\frac{n!}{\prod size_u}

考虑这个问题在我们重构树上的组合意义。首先非链底节点的sizesize 都是11,链底节点对应的sizesize是所在实链链顶在原树中的sizesize。因此答案即为n!uSsizeu\frac{n!}{\prod_{u \in S} size_u},其中SS表示链顶集合,sizeusize_u表示在原树上的子树大小。为了维护集合SS,可以用 lct 或 树剖的方法做到1log。这里介绍树剖的方法。

考虑每次access对于树剖上一条重链的影响是:一个前缀的链顶被清空了,然后前缀的末尾加入SS。于是每条重链可以用一个栈维护,栈顶是浅的点,每次只会在栈顶做push和pop操作,均摊复杂度O(nlogn)O(n \log n)

D:

什么 b 玩意。

考虑对问题做如下转化:随机一个排列PP,第ii次操作删除PiP_i的倍数,但如果PiP_i已经被删除则不计入次数。

由期望线性性,答案是每个PiP_i被记入次数的概率之和。也就是PiP_i与其因子们,PiP_i是在排列里第一个出现的概率,也就是1dPi\frac{1}{d_{P_i}},其中dud_uuu的因子个数。

f(x)=1dxf(x) = \frac{1}{d_x},容易发现fxf_x是积性函数,可以线性筛,获得部分分。也可以min25/洲阁筛。总之选取你喜欢的筛子,可以得到O(n1ε)O(n^{1 - \varepsilon})O(n34logn)O(\frac{n^{\frac{3}{4}}}{\log n})之类的复杂度。