山外集训Day4

题面和题解:https://files.cnblogs.com/files/blogs/832279/day4.zip?t=1785538206&download=true
也可以看我写的题解。

T1

首先,我们贪心地去想:对于同一种优惠券,既然对同一件商品的优惠是相同的,那么肯定是按照价格从小到大去选这种优惠券。
其次,我们再次贪心地去想:要用优惠购买的一定是所有商品从大到小排序后的一段前缀。
我们还能再贪心一下吗?把除以三的优惠券都给价格更大的商品,把除以二的优惠券都给更小的?
不行!!!
考虑有两个价值为 \(8,9\) 的商品和一个价格为 \(1\) 的普通优惠券以及一个价格为 \(1\) 的超级优惠券,假设我们给 \(9\) 超级,给 \(8\) 普通,则总价为 \(9\);假设我们给 \(8\) 超级,给 \(9\) 普通,则总价为 \(8\),比前面那一种优。
所以这个贪心我们得换成dp。
我们先把两种优惠券分别按照价格从小到大排序。
把商品按照价格从大到小排序。
\(f_{i,j}\) 表示前 \(i\) 个商品都用优惠券,用了 \(j\) 个超级优惠券的最小价值。
显然 \(f_{i - 1, j}\to f_{i, j + 1} + \lfloor\frac{a_i}{3}\rfloor + c_{j + 1}\)
\(f_{i - 1, j}\to f_{i, j} + \lfloor \frac{a_i}{2}\rfloor + b_{i - j}\)

T2

加边容易删边难,所以我们倒着做。
我们维护当前每个联通块内的直径,以及对应的两个端点。
如何统计答案?
我们以最大的直径的中点作为根,连接其它直径的中点。
这样连出来的直径一定最小。
我们令最大的联通块直径为 \(fi\),次大的为 \(se\),第三大的为 \(th\)。(用set维护就行)
则这样连完的直径大小为 \(\max(fi, \lceil\frac{fi}{2}\rceil + \lceil\frac{se}{2}\rceil + 1, \lceil\frac{se}{2}\rceil + 1 + \lceil\frac{th}{2}\rceil + 1)\)
注意到题目让求的是点数,我们把这个东西整体加一个 \(1\) 即可。
考虑合并两个联通块,此时的直径的两个端点一定为这两个联通块的共四个端点中的两个。
我们直接枚举是哪两个即可。
复杂度 \(\mathcal O(n\log n)\)
还有就是一定要用欧拉序LCA,以及 \(\mathcal O(\alpha(n))\) 的并查集,否则会被毒瘤出题人卡掉 \(70pts\sim 80pts\)(注意到是卡掉而不是卡成)。

T3

老师上课讲得有点含糊不清,还是看题解吧。

T4

不会,详情看题解。


讲的题:https://files.cnblogs.com/files/blogs/832279/day4ti.zip?t=1785538134&download=true

posted @ 2026-08-01 06:51  SigmaToT  阅读(8)  评论(0)    收藏  举报