Atcoder Grand Contest 056 B - Range Argmax
因为一组 x 可能对应多组 p,考虑怎么让决策唯一化。
我们从大到小依次钦定每个值的位置,即倒着遍历 i=n,n−1,⋯,1,找到最左端的位置 v 满足,对于现在还活着的所有区间 j 满足 lj≤v≤rj,都有 xj=v,令 pj=i,然后删去所有包含 i 的区间。显然对于一组合法的 {xm},我们总能唯一还原出对应的排列 p。
这样以来,原本对 x 计数可以转化为对排列 p 计数。即计算有多少个不同的 p,满足这组 p 对应的 {xm} 按照这种方式构造以后还原出来的排列刚好也是 p。
对于一个合法的排列 p,以区间 max 为键值建立笛卡尔树,显然笛卡尔树的形态是唯一的。而对于一棵合法的笛卡尔树,要对应得到合法的 p 显然只能从根开始按先序遍历依次赋值 n,n-1,n-2,\cdots,1,也就是说合法的笛卡尔树与排列形成双射,因此考虑对笛卡尔树进行 DP。
假设当前考虑到笛卡尔树上的区间 [l,r],我们枚举 [l,r] 中最大值的位置 k,递归处理 [l,k-1] 和 [k+1,r] 的部分。但是根据我们的先决条件,这里的 k 是所有合法的 k 中最靠左的,所以对于 [l,k-1] 的取值也自然要有一些限制。这里有一个结论:设 k' 为 [l,k-1] 最大值的位置,那么 [l,r] 合法的充要条件是,[l,k-1],[k+1,r] 都是合法的,且不能存在一个 l\le l_i\le k'\le k\le r_i\le r。
必要性:如果不存在 l\le l_i\le k'\le k\le r_i\le r,那么把最大值钦定在 k' 也是合法的。充分性:如果存在 l\le l_i\le k'\le k\le r_i\le r,那么根据左区间的合法性可知把最大值钦定在 k' 以左是不合法的,而如果把最大值钦定在 [k',k) 中某个位置,那么有 x_i\ne k,也不合法,这样最左端合法位置就是 k 了。
这样以来考虑 dp_{l,r,k} 表示有多少种不同的以 [l,r] 为根的合法的笛卡尔树数量,满足 [l,r] 最大值位置 \ge k。预处理 g_{l,r,k} 表示当 [l,r] 最大值位置为 k 的时候,[l,k-1] 最大值位置最小是多少,这样转移可以做到 O(1)。
时间复杂度 O(n^3)。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步