非模拟赛改题记录

AT F - Knapsack with Diminishing Values

分组背包 + 优先队列优化

发现算贡献的式子把个数绑定了,使得不得不枚举个数来更新答案,这样的话时间复杂度就太高了是 \(O(n^3)\) 级别的。

考虑拆贡献,原式为 \(kv-k^2\) 第一项正常计算,把第二项拆开 \(k^2=\sum_{i=1}^{k}2i-1\) 这样一个物品取到第 \(i\) 个时相比与 \(i-1\) 个增加的贡献就是 \(v-2i+1\)

但是这样显然时间复杂度没变。考虑按 \(w\) 分组,对于每个相同的 \(w\) 总共最多只能取 \(\frac{W}{w}\) 个,所以只要能求出这 \(1~\frac{W}{w}\) 取到这么多个时最优就行,但相同的 \(w\) 可能对应有多个 \(v\) ,但同时又发现对于一个 \(v\) 取得越多下一个增加的贡献越少,显然答案是具有继承性的(即取了 \(i+1\) 个时的方案可以在 \(i\) 个的方案上通过新加入一个继承而来),所以可以优先队列维护当前 \(w\) 对应的所有 \(v\) 下一个增加的贡献和已经取到个数。

根据调和级数得知 \(\sum_{i=1}^{W}\frac{W}{i}=WlnW\) ,即物品总个数,所以时间复杂度为 \(O(n^2logn)\)

AT G - No Cross Matching

结论题

先上结论,记 $t = \sum dist(P_i,Q_{R_i}) $ 当 \(t\) 最小时一定无相交,即不存在无解情况。

证明前先考虑一件简单的事,对于两条相交的线段,交换它们的一个端点使其不相交,这会使两条线段的总长度减少,证明考虑三角形三边关系在此不表。把这样的交换称为操作

考虑反证法去证明结论,若存在一组 \(t\) 最小时依旧相交的情况,发现每次操作都会使 \(t\) 减少,那么此时仍可以进行一次操作使 \(t\) 减小,这违背定义 \(t\) 最小,即不存在一组 \(t\) 最小时依旧相交的情况,即当 \(t\) 最小时一定无相交,证毕。

考虑怎么去获得最小的 \(t\)

有两种做法

第一种:最小费用最大流/匈牙利。简单建模,在此不表,但是可能需要复杂度稍优的算法

第二种:先咕一下

posted @ 2024-09-29 08:07  Qyun  阅读(74)  评论(0编辑  收藏  举报