A
不难发现,满足 3 A ≤ N 3^A \le N 3A≤N 的 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−(m−2) 个区间,我们随便放一些极大区间,凑满 n n n 个区间。所以,如果 n − ( m − 2 ) < 0 n-(m-2)<0 n−(m−2)<0 即 m ≥ n − 1 m≥n-1 m≥n−1,要直接输出 − 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 S→Li 的点未被删除,那么对于 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' TRi∈S′ 的 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 Ti∈S 的 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=0∑d1−1a2=0∑d2−1⋯an=0∑dn−1[∑ai=n−2]∏i=1nai!(n−2)!i=1∏ndi 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(n−2)!a1=0∑d1a2=0∑d2⋯an=0∑dn[∑ai=n−2]i=1∏n(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=0∑di(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(n−2)! [xn−2]i=1∏nFi(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(n−2)!(n−2∑i=1ndi)
令
s
s
s 为所有
d
i
d_i
di 的和,有
a
n
s
=
s
n
−
2
‾
×
k
ans=s^{\underline {n-2}} \times k
ans=sn−2×k
总复杂度 O ( n ) O(n) O(n),明显简单于 E 题。