ARC 106(Atcoder Regular Contest 106)A-E 题解

A

不难发现,满足 3 A ≤ N 3^A \le N 3AN A A A 并不多,于是我们枚举 A A A 并暴力判断是否存在一个对应的 B B B 即可。

时间复杂度 O ( log ⁡ 3 n log ⁡ 5 n ) O(\log_3 n \log_5 n) O(log3nlog5n)

B

可以发现一个性质: 如果一个连通块内,节点的所有初始权值之和与目标权值之和相等,那么这个连通块一定能够达到要求,否则一定不行。

于是,我们使用并查集维护连通块内节点初始权值之和节点目标值之和。最后,看一下是否所有连通块都满足要求。

时间复杂度 O ( n log ⁡ n ) O(n \log n) O(nlogn)

C

这是一道比较新颖的题套题。

首先,我们先看看题目中的那道题。毫无疑问,两人最终选定的区间都两两不相交,但是 T T T(Takahashi)的解法正确(能够得到最大值), A A A(Aoki)的解法错误。

所以,我们先判断 m < 0 m<0 m<0 的情况。根据上面两人解法的性质,显然应该输出 − 1 -1 1

然后,考虑如何构造。首先,我们先摆一个极大区间,左端点为 1 1 1,右端点为 1 0 9 10^9 109。此时, A A A 只能选择一个区间。

然后,我们构造 m + 1 m+1 m+1 个互不相交的小区间,让 T T T 把这些区间选走。最后,对于剩下的 n − ( m − 2 ) n-(m-2) n(m2) 个区间,我们随便放一些极大区间,凑满 n n n 个区间。所以,如果 n − ( m − 2 ) < 0 n-(m-2)<0 n(m2)0 m ≥ n − 1 m≥n-1 mn1,要直接输出 − 1 -1 1

注意, l l l 必须两两不同, r r r 也必须两两不同。所有极大区间的右端点不能超过 1 0 9 10^9 109


可是为啥还是 ⌊ \lfloor WA ⌉ \rceil

对于 n = 1 , m = 0 n=1, m=0 n=1,m=0的情况,程序输出了 − 1 -1 1;但是否可以构造出一个满足要求的方案呢?显然是可以的,于是特判一下就能过了。

时间复杂度 O ( n ) O(n) O(n)

D

这题 的弱化版。

E

神仙题,但不乏套路。

算法一

考虑网络流。

建立源点汇点, n n n 个点表示员工,足够多个点表示日子。源点向每个员工连流量为 1 1 1 的边,员工向每个来工作的日子连流量为 inf \text{inf} inf 的边,日子向每个汇点连流量为 1 1 1 的边,则最大流即为答案。

我们考虑,到底需要建立多少个点表示日子。不难发现,在样例 2 2 2 所示的最劣情况下,只能每隔一天颁一次奖,但纵使这样,总天数也是 2 n k 2nk 2nk 级别的。所以,只需要建立 2 k 2k 2k 个表示日子的点就行了。

采用 Dinic 即可。总复杂度 O ( 2 n k n k ) O(2nk \sqrt {nk}) O(2nknk ),无法通过。

算法二

注意到 n n n 只有 18 18 18

首先,根据最大流 = = = 最小割,我们仅考虑最小割。

我们枚举左侧点(即表示员工的点)中,哪些点连向汇点的边未被删除。显然,若 S → L i S \to L_i SLi 的点未被删除,那么对于 L i L_i Li 连向的每个点而言,它到汇点的边必须被删除。

换言之,令这样的点集为 S S S,若 ( R i , T ) (R_i,T) (Ri,T) 被删除,当且仅当 T R i T_{R_i} TRi S S S 的交集非空。这里 T R i T_{R_i} TRi 表示,所有在 R i R_i Ri 那天工作的人的集合。

预处理出所有的 T R i T_{R_i} TRi,每次枚举 S S S 并暴力计算即可。

时间复杂度 O ( 2 n k ) O(2^nk) O(2nk),无法通过。

算法三

根据算法二,现在关键在于,对于每个 S S S 能够快速求出满足 T R i  and  S ≠ 0 T_{R_i} \ \text{and} \ S \neq 0 TRi and S=0 R i R_i Ri 的数量。其实,它就是满足 T R i ∈ S ′ T_{R_i} \in S' TRiS R i R_i Ri 数量,这里 S ′ S' S 表示 S S S 的补集。

现在问题转化为: 给定若干个 T i T_i Ti,每次给定 S S S,你需要求出,满足 T i ∈ S T_i \in S TiS i i i 的数量。

我们开桶并进行 FWT \text{FWT} FWT 变换,即可一次性预处理出这些量。

综上所述,时间复杂度 O ( n 2 n + k ) O(n2^n+k) O(n2n+k)。好耶!

F

Prufer 序列套路题。

考虑对于每一个节点,枚举它在 Prufer 序列中出现的次数 a i a_i ai,即度数减 1 1 1。根据可重集排列的公式以及乘法原理,不难得到下面的式子:

∑ a 1 = 0 d 1 − 1 ∑ a 2 = 0 d 2 − 1 ⋯ ∑ a n = 0 d n − 1 [ ∑ a i = n − 2 ] ( n − 2 ) ! ∏ i = 1 n a i ! ∏ i = 1 n d i   a i + 1 ‾ \sum_{a_1=0}^{d_1-1} \sum_{a_2=0}^{d_2-1} \cdots \sum_{a_n=0}^{d_n-1} [\sum a_i=n-2]\frac {(n-2)!} {\prod_{i=1}^n a_i!} \prod_{i=1}^n d_i^{\ \underline{a_i+1}} a1=0d11a2=0d21an=0dn1[ai=n2]i=1nai!(n2)!i=1ndi ai+1

令所有的 d i d_i di 乘积为 k k k。在求出 k k k 后,我们将 d d d 中的每个数都减去 1 1 1,得到

= k ( n − 2 ) ! ∑ a 1 = 0 d 1 ∑ a 2 = 0 d 2 ⋯ ∑ a n = 0 d n [ ∑ a i = n − 2 ] ∏ i = 1 n ( d i a i ) =k(n-2)!\sum_{a_1=0}^{d_1} \sum_{a_2=0}^{d_2} \cdots \sum_{a_n=0}^{d_n} [\sum a_i=n-2] \prod_{i=1}^n {d_i \choose a_i} =k(n2)!a1=0d1a2=0d2an=0dn[ai=n2]i=1n(aidi)

考虑构造生成函数,即令

F i ( x ) = ∑ i = 0 d i ( d i i ) x i = ( x + 1 ) d i F_i(x)=\sum_{i=0}^{d_i} {d_i \choose i}x^i=(x+1)^{d_i} Fi(x)=i=0di(idi)xi=(x+1)di

从而
a n s = k ( n − 2 ) !   [ x n − 2 ] ∏ i = 1 n F i ( x ) ans=k(n-2)! \ [x^{n-2}]\prod_{i=1}^n F_i(x) ans=k(n2)! [xn2]i=1nFi(x)

更进一步的

a n s = k ( n − 2 ) ! ( ∑ i = 1 n d i n − 2 ) ans=k(n-2)!{{\sum_{i=1}^n d_i} \choose {n-2}} ans=k(n2)!(n2i=1ndi)

s s s 为所有 d i d_i di 的和,有
a n s = s n − 2 ‾ × k ans=s^{\underline {n-2}} \times k ans=sn2×k

总复杂度 O ( n ) O(n) O(n),明显简单于 E 题。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值