非模拟赛改题记录
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\) 。
有两种做法
第一种:最小费用最大流/匈牙利。简单建模,在此不表,但是可能需要复杂度稍优的算法
第二种:先咕一下