Gym102253(2017 Chinese Multi-University Training, BeihangU Contest)

链接

A. Add More Zero

B. Balala Power!

K. KazaQ's Socks

L. Limited Permutation

签到题。

C. Colorful Tree

(O(nlogn)) 有若干种写法:

点分:每次碰到该种颜色就统计这个颜色子树内所有点关于这个颜色的贡献,然后关于这种颜色这个子树就直接删掉

DSU on Tree:合并的时候也是对于较小子树的各种颜色,对于较大的子树还没有这种颜色的点进行贡献。

(O(n)) 的做法:相当于对于相邻的同种颜色计算它们之间的白色连通块大小。对于每种颜色维护一个 (vector) ,在 (u) 遍历完其中一棵子树 (v) 时,把 (u) 颜色的 (vector) 清空,并且白色连通块大小就是 (size_v) 减去 (vector) 中的所有元素。

D. Division Game

全看题解就不是很想写代码。。

因为每一堆个数都是固定的,记 (f(k)) 表示 (k) 轮之后还没有取完的方案数,也相当于 (k+1) 轮恰好取完的方案数。

所以最终 (p) 的答案就是 (sum_{i=1}^{sume}(f(i))^{p-1}(f(i-1))^{n-p+1})。所以任务就是计算 (f)

(g(k)) 表示没有每次都是因子的限制,那么就是一个插板法,然后二项式定理得到 (f)( ext{ntt}) 即可。

[g_k=prod_{i=1}^m inom{e_i+k}{k}\ f_k=sum_{j=0}^{k} inom{x+1}{j}(-1)^jg(x-j) ]

E. Expectation of Division

还是与质数无关,可以全部压成最小的质数组合,然后令前一个质数个数必须大于后一个,这样 (10^{24}) 以内只有 (2e5) 个点。

然后直接 (dp),高维前缀和即可。

高维前缀和其实就是第 (i) 维表示 (leq i) 维(砍掉高的维度)的整个矩阵之和。

有一个东西搞了老半天,就是前缀和应该是从个数少往个数多累加还是反过来,答案应该是前者。因为这道题会把个数多因子往前压,所以矩阵不是全的。如果因子个数较少的维度做更高维的话,要知道比它低的维度是可以乱来的,但这里却必须要保证下面的因子个数大于这一维,导致算重。可以画一个 (2*2*2) 来理解。

F. Function

考虑转化一下题意,就有:

[b^{-1}(f_i)=f(a_i) ]

也就是说假设 (f(i)=x) ,那么就有 (f(a_i)=b^{-1}(x)),会发现自变量和因变量都在置换环上走。所以一个 (a) 的环答案就是所有长度是其因子的 (b) 环长度和,最后所有 (a) 环长度加起来即可。

G. Gear Up

转化一下题意,相当于一棵树有黑边和白边,每个点有一个势能和权值,权值计算方式如下:

  • 如果这个点是白点,那么就是它父亲的权值。
  • 如果是黑点,那么权值为父亲的权值加上两者的势能相减的差。

从上往下递推。支持动态加点和改势能,求全局最大权值。

直接做?为啥切的人这么少。。首先把树的最终形态搞出来然后树剖,( ext{dfs}) 的时候使得一个节点的白子数和黑子树分别在一个连续的区间,然后改一个点的势能就是整棵子树 + 节点的权值改变,然后黑节点区间额外加一个势能的改变。

复杂度 (O(nlog^2n))

H. Hints of sd0061

对于询问排序,然后从后往前每次对于一个前缀进行 ( ext{nth_element}),总复杂度是 (sum Fib_i leq 2n)

J. Journey with Knapsack

推柿子:

[egin{aligned} & prod_{i=1}^{n} (sum_{j=0}^{a_i}x^{ij})\ & =prod_{i=1}^{n}(1-x^{(a_i+1)i}) prod_{i=1}^{n} frac{1}{1-x^i}\ & equiv prod_{i=1}^{2n}frac{1}{1-x^i}(1-sum_{i=n+1}^{2n}x^i)prod(1-x^{(a_i+1)i}) mod x^{2n+1} end{aligned} ]

第二行到第三行其实就是把右边那个柿子容斥了一下变成正整数拆分。

然后后面两项直接 (O(nsqrt n)) 直接背包即可,前面正整数拆分有一个五边形数定理可以做:

[prod_{k=1}(1-x^k)=sum(-1)^k x^{frac{3k^2-k}{2}} ]

其中 (x) 的次数是五边形数,直接搞出来然后求逆,但是要 ( ext{MTT})

还有一种是继续做背包:前面 (sqrt n) 和整数直接背包,后面因为个数 (leq sqrt n) ,所以做正整数拆分的 (O(nm))(dp)(m) 为已选个数,每次可以选一个最小值或全体加 1。然后最后的 (dp) 可以在前面背包做完的数组上继续做,这样就不用卷积了。

原文地址:https://www.cnblogs.com/Forever-666/p/15503548.html