🍕🏠🌋 当前时间是:

 

🌕

首先把匹配的 \(i<j\) 的限制去掉。

这样两点只要满足所在集合相邻就可以匹配。

如果有 \(i<j\) 的限制,就贪心地让 \(i\) 集合的一段前缀匹配 \(i+1\) 集合的一段后缀。

可以发现,这么做相当于在 \(i\)\(i+1\) 之间限制了匹配的数量 \(b_i\)

假设可以求出 \(b_i\),可以考虑把 \(m\) 个集合构成的环断掉一条边,枚举这条边匹配了多少次,剩下部分的链就是二分图了。

这个二分图的最大匹配数可以对偶成最小割,可以得到一个能用矩阵刻画的 dp。

又注意到如果枚举断掉的边匹配了 \(x\) 次,那么得到的最大匹配是关于 \(x\) 的一次分段函数,由于它们是取 \(\min\) 的,所以这关于 \(x\) 是凸的,可以三分出最优点。

这部分复杂度是一个 \(\log\)

接下来考虑如何求出 \(b\)

可以二分答案转成判定,相当于问两个大小为 \(t\) 的集合 \(A,B\),是否满足 \(\forall 1\leq i\leq k,A_i<B_i\)

把限制拆到 \(B\) 集合每个数上,设最大的 \(j\) 满足 \(A_j<B_i\)\(v_i\),相当于要 \(\forall 1\leq i\leq k,v_i-i>0\)

使用动开线段树维护每个集合即可,二分要在线段树上二分。

时间空间复杂度都是 \(O(n\log n)\) 的。

事实上求 \(b\) 的过程就是括号匹配,但是我赛时没有意识到这一点,就写了这个特别麻烦的做法。

posted @ 2025-05-02 21:33  zzafanti  阅读(32)  评论(0)    收藏  举报
浏览器标题切换
浏览器标题切换end