• 保序回归问题学习笔记


    补上场 CF GLBR 的 H 时发现通过的人的代码都和官方题解完全不一样,一问发现是保序回归板子就来学了。

    什么是保序回归问题

    保序回归问题,说白了就是给你一张有向图 \(G\),并给定每个点的两个属性 \(w_i,y_i\),要求一个序列 \(f_i\),满足对于图中所有有向边 \(u\to v\),均有 \(f_u\le f_v\)。额外给定正整数 \(p\),要求最小化 \(\sum\limits_{i=1}^nw_i|f_i-y_i|^p\)。我们统称这类问题为 \(L_p\) 问题。

    其实我们之前做过的不少与 DAG 上赋值的问题有关的问题都和保序回归问题有关,譬如 [BalticOI 2004]Sequence 数字序列,便是全序集上的 \(L_1\) 问题。对于那题而言,有维护折线法、单调栈等多种做法,但都不易拓展到更一般的情形。

    下面将介绍一种适用于更一般情况的解决保序回归问题的做法:

    前置知识:整体二分

    其实思想挺简单,对于某些数据结构题,解决单组询问可以二分,但是对每组询问都二分就显得效率低下,这时候我们可以把询问弄在一起二分,即定义函数 solve(l, r, pt) 表示编号在 pt 中的询问答案在 \([l,r]\) 中,然后用数据结构将状态调整到 \(mid=\dfrac{l+r}{2}\) 的状态即可判断 \(pt\) 中询问的答案与 \(mid\) 的大小关系。

    \(L_1\) 问题的解法

    仿照之前整体二分的思路,我们还是考虑用分治的方法逐步确定每个 \(f_i\) 的取值,solve(l, r, pt) 表示我们确定 \(pt\) 中元素的 \(f\) 值都在区间 \([l,r]\) 之间。但是这样一来问题就出现了,还是记 \(mid=\dfrac{l+r}{2}\),相较于数据结构题中的整体二分,在这个问题中我们不太好直接判断 \(f_i\)\(mid\) 的关系,于是事情逐渐变得棘手起来。

    别急,我们先来挖掘一些性质。我们做出如下定义:

    Definition. 定义原问题的 \(S=\{a,b\}(a<b)\)​ 问题表示在原问题的基础上,还强制要求所有 \(f_i\in[a,b]\),最小化上式的值。

    那么细细思考可以得出如下结论:

    Conclusion. 假设 \(\forall i,y_i\notin(a,b)\)\(f’_i\) 为原问题的一组解满足 \(f’_i\notin(a,b)\),那么我们通过将所有 \(<a\)\(f’_i\) 变成 \(a\)\(>b\)\(f’_i\) 变成 \(b\),也可以得到原问题的 \(S\) 问题的一组解。

    针对上面的结论,论文里给出了较为详细的证明,然而由于本文笔者水平有限,这里只稍微口胡几句。首先 \(y_i\notin(a,b)\),则意味着满足条件的 \(f’_i\) 一定存在,因为如果在 \((a,b)\)​ 中肯定选择向左或向右平移之一答案不会变劣并且依旧满足偏序关系,而如果原来的 \(f’_i<a\),则意味着 \(f’_i\) 比较小的情况是最优解,因此在 \(S\) 问题中我们将其平移到 \(a\),否则我们将其平移到 \(b\),这样肯定是最优策略。

    有了这个结论后事情就变得容易多了,我们考虑 \(S=\{mid,mid+1\}\),对于 \(y_i\) 都是整数的情况,显然存在 \(f_i\) 都是整数的最优策略,也就是说显然不存在 \(y_i\in(mid,mid+1)\),根据上面的结论,我们求出原问题的 \(S\) 问题的一组解——每个 \(f_i\) 只有两种可能:\(mid,mid+1\),而对于有向边 \((u,v)\)\(f_u=mid+1,f_v=mid\) 的情况是不合法的,经典的最大权闭合子图的模型,网络流求解。这样我们即可知道每个 \(f_i\)\(mid\) 的关系。这样复杂度大概是 \(\log n·\text{网络流的复杂度}\),根据实测结果(CF1615H),\(n,m\le 1000\) 的数据大概 100 多 ms 就可以出结果。

    \(L_p(p\ge 2)\) 问题

    其实和 \(L_1\) 问题大差不差,但是由于对于 \(p\ge 2\) 的情况,就算 \(y_i\) 都是整数,也不一定存在 \(f_i\) 都是整数的最优解,(举例:\(x^2+(y-1)^2,x\ge y\)),这时候我们取正整数集的 \(1\) 为最小单位就不可取了。因此考虑 \(S=\{mid,mid+\epsilon\}\),直接做会有精度问题,但是显然权值同除 \(\epsilon\) 问题的解不会改变,因此考虑将网络流建模中的边权设为 \(w_i|x-y_i|^p\)\(mid^+\) 处的导数。如果要求求精确解那就在实数域上二分即可,否则如果要求整数解,那我们递归到 \(r-l=1\) 时,将 \(l,r\) 当作两种决策,再跑一次最大权闭合子图即可。

    特殊偏序集的 \(L_p\) 问题

    不难发现上面算法之所以不能应对特别大(\(10^5\) 级别)的数据,是因为网络流复杂度太大了,也就是说如果我们能够高效地对于特殊图解决其 \(S=\{mid,mid+1\}\) 问题,那么我们也能够以更优的复杂度解决特殊偏序集的 \(L_p\) 问题。举几个常见的例子,全序集 \(S=\{mid,mid+1\}\) 问题的解显然是一段前缀对应 \(mid\),一段后缀对应 \(mid+1\),直接模拟即可,对于偏序集构成内 / 外向树的情况可以树形 DP,仙人掌的情况通过破环成链也可以变成树的情况。总之还是具体情况具体分析。

    例题

    1. CF1615H Reindeer Games

    板子题,直接按照上面的方法整体二分即可。不知道 GLBR 放个这样的 H 是几个意思(其实看官方题解感觉是外国人不知道保序回归这个科技?

    2. P6621 [省选联考 2020 A 卷] 魔法商店

    首先有一个结论:一组基是所有基中权值最小的充要条件是那么它肯定比所有与这组基只差一个元素的基权值都要小,因此直接暴力找到所有与其只差一个元素的基,这样问题可以转化为 \(L_2\) 问题,按照上面的做法来即可。

    3. Topcoder 14634 ExtremeSpanningTrees

    和上一题唯一的联系就是完全一样(

    还是老道理,找到所有与 \(E_1\) 只差一条边的生成树 \(T\),设 \(e_1\) 为唯一的在 \(E_1\) 中而不在 \(T\) 中的边,\(e_2\) 为唯一的在 \(T\) 中而不在 \(E_1\) 中的边,那么问题的限制可看作 \(e_1\) 的权值 \(\le e_2\) 的权值,对 \(E_2\) 也做一遍类似的操作,然后跑 \(L_1\) 问题即可。

    参考文献:

    • 高睿泉《浅谈保序回归问题》,2018 年集训队论文。
  • 相关阅读:
    【SQL】通过Sql实现根据分组合并指定列内容的查询 SamWang
    [转]SQLServer中全文搜索与Like的差异分析
    【笔记】《C#高效编程改进C#代码的50个行之有效的办法》第1章C#语言习惯(1)属性的特性以及索引器(SamWang)
    [转]SqlServer全文索引实例
    [转]visual studio2005中文版无法打开项目文件:*.csproj,提示“此安装不支持该项目类型”的解决办法
    [转]李天平:程序人生成长发展中的一些感悟
    【改进】C# WinForm捕获全局异常 SamWang
    Windows 7 虚拟无线网卡(microserof virtual wifi miniport adapter)功能的使用
    VB.Net 串口通信示例
    VB.Net 串口通信用法
  • 原文地址:https://www.cnblogs.com/ET2006/p/bxhg.html
Copyright © 2020-2023  润新知