AGC005 题解

比赛链接

题目评分:1054-1828-1976-2943-3276-3440

A STring

水题,直接用个栈,不断处理一下即可。

B Minimum Sum

经典题,数据结构各显神通,肯定得枚举一个位置算贡献。

Solution

算法一

我没有脑子,这题直接线段树一下,做一遍二分,二分出每一个位置所能成为答案的最大左右区间,乘法原理计数即可。

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

算法二

我学习过单调栈,这题不是单调栈裸题吗。

记录每个数踢出去的数的个数,那么当前数的向前的最多可延展的区间也可以出来,类似的,向后的最多可延展的区间个数也可以出来。

时间复杂度 (O(n))

C Tree Restoring

Solution 智商题,没有智商的 cnyz 被区分了。

考虑 (a_i) 的最大值是如何来的,显然是一条直径,那么,(min a_ige max a_i)

容易想到,如果 (max a_i) 是奇数,那么最小点得有两个,同理,(max a_i) 为偶数时,最小点得有一个,同时,(a_i) 除了最大值和最小值,之间的至少有 (2) 个。

那么这些都判一下就行了,时间复杂度 (O(n))

D ~K Perm Counting

Solution 正着求很不好求,考虑容斥。

显然可以将原本的不能选的关系抽象成一个二分图,那就是会变成若干条链,且相邻的边不能取,将链拍平到序列上考虑 DP。

(f_{i,j,0/1}) 表示现在在第 (i) 位选了 (j) 条边,且当前这条边选了或没选,有转移:

[f_{i,j,0}=f_{i-1,j,0}+f_{i-1,j,1}\f_{i,j,1}=f_{i-1,j-1,0} ]

直接暴力 dp,可以做到 (O(n^2)) 的时间复杂度,注意判当前是不是链头。

好像用多项式可以优化到 (O(nlog n))?不过我不会。

E Sugigma: The Showdown

Solution 博弈好题。

考虑什么时候会陷入无限循环,称一条树 (a) 上的边 ((u,v)) 是横跳边,当且仅当 ( ext{dist}_b(u,v)ge 3),这是不需要证明的。

容易发现,我们可以处理出所有可达的点,容易使用 dfs 解决,只需要比较某个点到两个起始点的距离。

如果在可达的点组成的连通块中出现了横跳边,那么可以无限循环,否则的话,A 想让轮数最多,那只能到一个距离出发点最远的点来等死,容易发现轮数是最大的。

时间复杂度 (O(n))

F Many Easy Problems

Solution 考虑枚举每个点算贡献,容易发现:

[f(i)=sum^n_{u=1}inom{n}{i}-sum_{vin son(u)}inom{siz_v}{i} ]

其中 (son(u)) 表示与 (u) 相连的节点集合,(siz_u) 表示子树大小。

可以看做是枚举每一个点,用所有答案减去不包含的答案。

化柿子:

[f(i)=ninom{n}{i}-sum^n_{u=1}sum_{vin son(u)}inom{siz_v}{i} ]

接着化简后面这一坨:

[sum^n_{u=1}sum_{vin son(u)}inom{siz_v}{i}\sum^n_{j=i}cnt_jinom{j}{i} ]

其中 (cnt_i) 表示 (siz=i) 的子树出现了几次。

拆掉组合数:

[frac 1 {i!}sum^n_{j=i}frac{cnt_j(j!)}{(j-i)!}\frac 1 {i!}sum^{n-i}_{j=0}frac{cnt_{j+i}(j+i)!}{j!} ]

后面的柿子是一个卷积形式,令 (F_i=cnt_ii!)(G_i=frac {1}{i!}),那么:

[frac 1 {i!}sum^{n-i}_{j=0}F_R(n-i-j)G_j ]

使用 FFT 优化,时间复杂度 (O(nlog n))

顺带说一句,(924844033) 的原根为 (5)

原文地址:https://www.cnblogs.com/lajiccf/p/15411446.html