CF1394(div1)
差 1E,看上去太仙了 (3500) 就咕了。
A
sb 题
B
-
给定一个 \(n\) 个点 \(m\) 条边的有向图,每个点的出度最多为 \(k\),每条边有个 \(1\sim m\) 范围内的权值。
-
求有多少长度为 \(k\) 的序列 \(c\) 满足如下约束:
-
\(1\le c_i\le i\)
-
对于度数为 \(i\) 的点,保留出边权值第 \(c_i\) 小的边,这张图会构成若干个环。
-
\(n,m\le 2\times 10^5,1\le k\le 9\)
\(\rm Sol:\)
每个点的出度都是 \(1\),所以入度也都是 \(1\),所以判定条件是这个。
对于 \(k=1\sim 9\),每个点的选择只有 \(i\),所以枚举会有一个 \(\mathcal O(9!)\)
但是 check 是 \(\mathcal O(n)\) 的。
考虑优化 check,发现假设 \(c_i\) 选了 \(j\) 那么 \(c_k\) 不能选 \(k\) 之类的互斥关系可以预处理。
复杂度为 \(\mathcal O(k!\times k^2+nk^2)\)
C
对于一个 \(01\) 串 S 你可以执行以下操作:
- 删除其中任意一个字符。
- 删除一个
01,10
类型的子串。 - 在结尾添加
0/1
- 在结尾添加
01/10
对于两个字符串 \(s,t\),定义其相似当且仅当每种字符的出现次数相同。
定义 \(\textrm{dist}(s,t)\) 为最小的操作次数使得 \(s\) 和 \(t\) 相同,每次操作可以对 \(t\) 或 \(s\) 进行操作。
给定 \(n\) 个字符串 \(s_{1,2...n}\),求一个字符串 \(t\) 使得 \(\max_{1\le i\le n}(\textrm{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(n\log n)\)
具体判定为,答案只关乎于差值的绝对值:
\((a,b)\) 均为正的时候答案为 \(\max(a,b)\),均为负同理。
一正一负的时候为 \(|a|+|b|\)
很容易得到每个点可以到达的点的区域,对每个区域列一个不等式,于是这个题就做完了。
D
给定 \(n\) 个节点的树,每个点有点权 \(v_i\),有高度 \(h_i\)
将原树的所有边划分成若干条链,使得每条链的高度递增,最小化所有链的点权和。
\(h_i,w_i\in[1,10^6],n\le 2\times 10^5\)
Solution
对于边 \(u,v\) 假设 \(h_u\ne h_v\),那么这条边的方向确定。
一个点对答案的贡献是经过他的链数,设 \(a\) 为指向它的边的数量,\(b\) 为指出去的边的数量,那么不难发现其贡献为 \(w_i\times \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\times w_i\)(当然部分是固定的,但是处理起来也很简单)
可以先假设所有元素选 \(0\),然后依次枚举 \(1\) 的数量,不难发现我们肯定优先选 \(f_{v,1}-f_{v,0}\) 尽可能小的元素。
然后即时更新一下贡献,特判一下 \(1\) 号节点,这个题就做完了。
复杂度是 \(\mathcal O(\sum \deg(i) \log)\) 大约是 \(\mathcal O(n\log n)\)
感觉评分偏高。。