差 1E,看上去太仙了 (3500) 就咕了。
A
sb 题
B
-
给定一个 (n) 个点 (m) 条边的有向图,每个点的出度最多为 (k),每条边有个 (1sim m) 范围内的权值。
-
求有多少长度为 (k) 的序列 (c) 满足如下约束:
-
(1le c_ile i)
-
对于度数为 (i) 的点,保留出边权值第 (c_i) 小的边,这张图会构成若干个环。
-
(n,mle 2 imes 10^5,1le kle 9)
( m Sol:)
每个点的出度都是 (1),所以入度也都是 (1),所以判定条件是这个。
对于 (k=1sim 9),每个点的选择只有 (i),所以枚举会有一个 (mathcal O(9!))
但是 check 是 (mathcal O(n)) 的。
考虑优化 check,发现假设 (c_i) 选了 (j) 那么 (c_k) 不能选 (k) 之类的互斥关系可以预处理。
复杂度为 (mathcal O(k! imes k^2+nk^2))
C
对于一个 (01) 串 S 你可以执行以下操作:
- 删除其中任意一个字符。
- 删除一个
01,10
类型的子串。 - 在结尾添加
0/1
- 在结尾添加
01/10
对于两个字符串 (s,t),定义其相似当且仅当每种字符的出现次数相同。
定义 ( extrm{dist}(s,t)) 为最小的操作次数使得 (s) 和 (t) 相同,每次操作可以对 (t) 或 (s) 进行操作。
给定 (n) 个字符串 (s_{1,2...n}),求一个字符串 (t) 使得 (max_{1le ile n}( extrm{dist}(s_i,t))) 最小,输出最小值和字符串。
Solution
首先操作是对称的,所以 12 类操作无效。可以只考虑 3,4 类操作。
每个 01 串可以被 0 的数量和 1 的数量两个维度描述 ((a,b)),每次操作为给 (a+1) 或者 (b+1) 或者 (a,b) 同时加 (1),或者给 (a-1) 或 (b-1) 或 (a,b) 同时减 (1)
- 请注意从绝对值来描述答案是有问题的。
不难想到二分,此时等价于 ((a,b)) 可以遍历到所有点。
操作次数的上界是 (2n) 的级别。只需要考虑 ((a,b)) 在 (k) 次操作内可以到达所有点。
等价于每个点可以到达的点的交集。
于是只需要判定所有点形成的区域是否有交即可。
复杂度 (mathcal O(nlog n))
具体判定为,答案只关乎于差值的绝对值:
((a,b)) 均为正的时候答案为 (max(a,b)),均为负同理。
一正一负的时候为 (|a|+|b|)
很容易得到每个点可以到达的点的区域,对每个区域列一个不等式,于是这个题就做完了。
D
给定 (n) 个节点的树,每个点有点权 (v_i),有高度 (h_i)
将原树的所有边划分成若干条链,使得每条链的高度递增,最小化所有链的点权和。
(h_i,w_iin[1,10^6],nle 2 imes 10^5)
Solution
对于边 (u,v) 假设 (h_u e h_v),那么这条边的方向确定。
一个点对答案的贡献是经过他的链数,设 (a) 为指向它的边的数量,(b) 为指出去的边的数量,那么不难发现其贡献为 (w_i imes max{a,b})
问题等价于你需要给高度相等的链确定方向最小化贡献和。
设 (f_{u,0/1}) 分别表示以 (u) 为根的子树,(u) 到父亲的边强制为连入/连出情况下的贡献和。
更具体的,问题变成给定 (m) 个二元组 ((f_{v,0},f_{v,1})) 给每个二元组选择一个权值,然后设 (a,b) 分别为 (0/1) 的数量,(k=max(a,b)) 贡献为权值和加上 (k imes w_i)(当然部分是固定的,但是处理起来也很简单)
可以先假设所有元素选 (0),然后依次枚举 (1) 的数量,不难发现我们肯定优先选 (f_{v,1}-f_{v,0}) 尽可能小的元素。
然后即时更新一下贡献,特判一下 (1) 号节点,这个题就做完了。
复杂度是 (mathcal O(sum deg(i) log)) 大约是 (mathcal O(nlog n))
感觉评分偏高。。