CF1394(div1)

差 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 你可以执行以下操作:

  1. 删除其中任意一个字符。
  2. 删除一个 01,10 类型的子串。
  3. 在结尾添加 0/1
  4. 在结尾添加 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))

感觉评分偏高。。

原文地址:https://www.cnblogs.com/Soulist/p/13640869.html