邻项交换、严格弱序的思路

该类型的题目少见,但是也涌现出了一些套路。

相关:
题目:国王游戏,皇后游戏(分糖果),数对
参考:c++严格弱序,ouuan,gigo,fsy,zxy

概述

这是一种常见的思路,希望f_i<f_j。我们对这个条件进行变形,甚者凭空加强出满足条件的式子。这通常只是题目的切入点。(gigo)

应用

我们使用这个式子作为排序函数来解决偏序要求或者贪心要求。而在《数对》中构建了dp顺序,就像拓扑序一样。

算法正确性

严格弱序
要求

若使用STL库的 sort() 函数需要满足严格弱序(strict weak ordering),否则将出现未定义的行为。设\odot为实现给STL比较的二元布尔关系:a\odot b: {\rm Obj} \times {\rm Obj} \to {\rm Bool},则有

  1. 传递性(transitivity) a\odot b \vee b\odot c \Rightarrow a\odot c
  2. 反对称性(antisymmetric) a\odot b \Rightarrow \neg a\odot b
  3. 不可比的传递性(a\odot b \vee b\odot a) \vee(b\odot c \vee c\odot b) \Rightarrow a\odot c \vee c\odot a

注意,根据反对称性可以轻松推出反自反性(irrefexibility)。

实现

对于一个要求不强的式子,可以构造出一个强于要求但方便排序的函数
否则思考调整函数满足关系,比如常见的a+b, a\times b,id关键字(第二关键字);或者根据对象的成员属性关系将对象分组,再考虑组内、组与组的排序方法。

跨项还是邻项?

一般直接考虑全局(gigo),如《数对》的简单性质要求,题目直接给出条件\forall i<j
也可以分析邻项交换前后的贡献,如皇后游戏性质更强的题目,之后推广(fsy):设中间有k项,把前后贡献式子列出来进行对比(zxy)。

题目拥有好的性质

对国王游戏,询问的是和最小:乘积从小到大排序一定最优,且只有这种排法。
对皇后游戏,询问的是最大值最小:根据题目条件有前面大一定不优,因此邻项可推广。不会出现退火的情况。也可以数学尝试推广(zxy)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容