2019 ICPC Asia-East Continent Final 部分题解

原文链接 www.cnblogs.com/zhouzhendong/p/ECfinal2019.html

A

枚举一下向量然后看一下这个向量有多少种放法就好了。

B

C

考虑已知一个多项式 \(g\),求 \(f = g ^ k\) 的前 \(n\) 项系数。

我们有 \(f' g = k g'f\),我们发现我们只需要知道 \(f(0)\),就可以在 \(n|g|\) 的时间复杂度内推出结果。

注意这里的 \(k\) 可以不是整数。

我们考虑上述问题的拓展:

有一个二元函数 \(g(x,y)\),求 \(f = g ^ k\)\(x^iy^j(1\leq i\leq n,1\leq j\leq m)\) 项系数。

我们发现

\[g\frac{\rm d}{{\rm d} x}f = k f \frac{\rm d}{{\rm d} x}g \]

于是我们就把问题转化成求一元多项式 \(f(0,y)\),套用之前的套路即可。时间复杂度为 \(O(nm|g|)\)

我们发现狄利克雷卷积就是一个关于各个质数的多元多项式卷积。直接拓展一下上述做法就可以在 \(O(n \log ^2 n)\) 的时间复杂度内解决问题。

但是,其实我们可以发现,如果常数项为 \(1\),那么上述过程中只要 \(k\) 在模意义下不变,答案就不变。于是假设 \(t \equiv \frac 1k \pmod {P}\),那么 \(g ^ \frac 1k = g ^ t\)。于是对于这个题我们只需要做一下狄利克雷卷积快速幂即可。时间复杂度是 \(O(n \log n \log P)\)

D

先考虑子树dp,对于每一个节点 \(x\),计算最晚什么时候到点 \(x\),使得能够遍历子树 \(x\) 中的点后回到并离开点 \(x\)

对于一个 \(x\),我们记最晚到达时间为 \(a_x\),记在子树 \(x\) 中要花费的时间为 \(b_i\)

然后我们记 \(a'_x,b'_x\) 为从 \(fa(x)\) 到子树 \(x\),遍历完子树再回到 \(fa(x)\) 的最晚到达 \(fa(x)\) 时间,和这一过程总用时,不难发现 \(a'_x = a_x -1, b'_x = b_ x + 2\)

然后我们考虑如何计算 \(a_x,b_x\)。如果我们已经知道了遍历 \(x\) 的所有子树的顺序是 \(y_1,y_2,\cdots,y_k\),则容易发现 \(b_x = \sum_{1\leq i \leq k} b'_{y_i}, a_x = \min_{1\leq i\leq k}(a'_{y_i} - \sum_{1\leq j< i} b'_{y_j})\)。接下来我们贪心选择遍历子树的顺序。设 \(s = \sum_{1\leq i\leq k} b_{y_i}\)。我们来考虑最后一个位置放什么。假设我们取的是 \(y_k\),那么 \(a_x \leq a'_{y_k} - (s - b'_{y_k}) = a'_{y_k} + b'_ {y_k} - s\)。简单分析即可发现最后一个数是使得 \(a'_{y_i} + b'_{y_i}\) 最大的 \(i\)。于是最优序列就是按照 \(a'_{y_i} + b'_{y_i}\) 升序排序的序列。

然后考虑设 \(dp_x\) 为从节点 \(x\) 开始遍历完子树并一去不返的最晚到达 \(x\) 时间。转移类似。

E

先把所有链求出来。

对于一条链,我们可以发现,移动到这条链的边权和是一个关于这条链的最终流量的分段常数函数。

于是我们只需要维护一个堆,每次贪心选代价最小的链即可。

F

G

H

我们发现一个长度大于等于 \(n/2\) 的等比数列一定满足一个性质:对于这个等比数列的所有相邻元素对,在原序列中坐标差小于等于1的至少有约 \(n/4\) 个。

于是我们只需要把原序列中坐标差小于等于1的点对之间的倍数拿出来,找所有出现次数大于那个阈值的求最长序列即可。

I

J

我们考虑找到最小值所在的位置,假设是 \(i\)。于是在 \(p_{i - c},p_{i-c+1}\cdots, p_{i - 1}\) 上的数都可以随意排列。接下来,如果 \(p_1..p_{i-1}\) 的最小值(设为 \(v\))在 \(p_{i-c},\cdots,p_{i-1}\) 中,那么,我们发现 \(p_{i-2c},\cdots,p_{i-1}\)几乎可以随意排列。几乎是指除了要保证 \(v\) 在后 \(c\) 个位置外,其他的都可以在这个范围内随意排序。

假如 \(p_1,\cdots, p_{i-1}\) 中的次小值在 \(p_{i-2c},\cdots , p_{i-1}\) 中,那么也可以类似推理。

于是我们就推出了关键的性质。

我们递归解决一个问题:solve(L,R,vl,vr),表示已知左侧搞出了 \(vl\) 个,右侧搞出了 \(vr\) 个。如果 \((vl+vr)\cdot c > R-L+1\),说明剩下的数可以在 \([L,R]\) 中随便放;否则假设剩下的数中的最小值在位置 \(k\),容易发现 \(k\) 只能被左侧或者右侧中的最多一侧安排,那么如果能被安排,那么 \(vl++/vr++\);否则的话,把问题分成两部分:solve(L,k-1,vl,1),solve(k+1,R,1,vr)

细节自理。

K

我们可以每次找一条边,满足它恰好有一侧是无限区域,且边权尽量小。我们发现,如果最小割经过了它另一侧的有限区域,则必然经过它。所以我们可以将组成这个有限区域的所有边权值加上这条边的权值,并删除这条边。

不断执行这样的操作,最终可以将图变成一棵树。跑 kruskal 即可。

L

M

我们可以把每一个数 \(t\) 写成 \(t = x ^ y\) 的形式,其中 \(x\) 尽量最小化。

然后按照 \(x\) 分组,暴力枚举选择的集合即可。

posted @ 2020-09-03 21:35  zzd233  阅读(914)  评论(0编辑  收藏  举报