atcoder ABC401 部分题解

Atcoder ABC 401 部分题解

如图(笑,最菜的一集

img

D - Logical Filling

This is a problem that requires careful case discussions.

哈哈

给定只由 .o? 组成的字符串 \(s\)

一个合法的 ? 填充要求 o 恰好有 \(k\) 个,没有两个 o 相邻,保证 \(s\) 至少有一个合法填充。

对于每一位,判断 \(s\) 的所有可能的字符串中,这一位能否为 .o

题解

所有存在的 o 左右两侧换成 .,这样所有的 ? 构成许多区间,一个长度为 \(w\) 的区间最多能填 \(\lceil\frac{w}{2}\rceil\)o ,设 \(sum\) 为最大能填的 o 数量(所有最值加起来)。

考虑现在还差多少个 o 需要填,记为 \(k\) L:

  • \(k=0\) ,则所有 ? 都是 .

  • \(k<sum\),则所有 ? 都是 ? 因为从最大填充上任意做平移都可以。

  • \(k=sum\) ,则每个区间填充都要填最大方案,其中偶数长度区间有两种填法,是 ? ,奇数长度区间填充唯一。

题目保证有解,所以 \(k \leq sum\)

E - Reachable Set

一个无向图,对 \(k=1,2\cdots n\) ,至少要删除多少个点使得 \(1,2,\cdots k\) 恰好构成一个连通块(可能无解)。

题解

对于一个 \(k\) ,求 \(1,2\cdots k\) 的导出子图和生成子图,二者的差就是答案(也就是额外直接连接的点的数量)。

用一个 \(vis_u\) 表示 \(u\) 是否在生成子图而不在导出子图内,枚举到一个点 \(u\) 时,把 \(v>k\) 的点加入 \(vis\),把 \(vis_u\)\(0\)

维护导出子图是否存在用并查集维护 \(1\cdots k\) 连通块个数就可以。

F - Add One Edge 3

给两棵树,在两棵树间加一个无向边(有 \(n_1\times n_2\)) 个方案,求每个方案下新树的直径的和。

题解

求出每棵树的直径 \(d_1,d_2\),每棵树求出 \(f_u,g_u\) 表示从 \(u\) 出发的最远距离。

那么添加一条边 \(u,v\) ,新树的直径就是:\(\max(\max(d_1,d_2),f_u+g_v+1)\) ,将 \(g_i\) 从小到大排序,对于固定的 \(f_u\),最大值取后者的是 \(g\) 的一段后缀,二分出来求和即可。

可以证明若一棵树的直径是 \(u->v\),那么 \(f_i=\max(dis_{u,i},dis_{v,i})\) ,可以用反证法证明,所以在求直径时就能顺便求出 \(f_u\)

G - Push Simultaneously

给二维平面上 \(n\) 个人和 \(n\) 个点,为 \(n\) 个人分配这 \(n\) 个点,使得每个人到他对应点的欧式距离的最大值最小。 \(n \leq 300\)

题解

求出每个人到每个点的距离,二分答案,将 \(n\) 个人和 \(n\) 个点视为二分图,将距离小于当前答案的边加入,该答案合法当且仅当二分图存在完全匹配,求一遍最大匹配即可,复杂度 \(O(n^3\log V)\)\(V\) 是距离值域。

实数二分时最好设定二分次数,可以获得较好的精度。

代码

posted @ 2025-04-25 14:22  蒻蒻虫  阅读(37)  评论(0)    收藏  举报