ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【题解】CF1601C Optimal Insertion

2021-11-06 14:35:01  阅读:183  来源: 互联网

标签:题解 位置 mid operatorname 插入 solve Insertion CF1601C 逆序


目录

最近太颓了……听 zbs2006 说有好玩的题就来做一做。


传送门里面还有传送门

给定两个序列 \(a\),\(b\),现在要将 \(b\) 插入 \(a\) 中,没有顺序和位置的要求,使最终的逆序对数尽可能少,求个数。

解析

我们容易得到 \(b\) 在插入时一定是有序的,否则交换两个数一定更优。感性理解一下就是在两个数之间并且值域也在两个数之间的数会对这对数造成贡献。

事实上想到这里就有一个简单易懂的做法:从左往右贪心插入,用线段树维护 \(\min\) 及其位置然后二分一下,每个数贪心插入最小位置就做完了。但我没有这么写。

接下来就是我永远想不到的部分了:对 \(b\) 分治,每次贪心插入 \(b_{mid}\),然后两边分别递归下去。接下来我们讨论正确性。


对于一个数 \(x\),记比它大的数为 +1,相等的为 0,否则为 -1。则对逆序对的贡献就是 \(x\) 之前的 +1 数减去 \(x\) 之后的 -1 数。

显然如果我们每次都将 \(x\) 后移一位,则贡献量至多改变 \(1\),且对于所有空隙,总贡献最小的位置总是构成若干个 0 的区间。

考虑比 \(x\) 小的数 \(x_1\) 的插入位置,注意到对于 \(x_1\) 而言,所有的 0 都会变成 +1,所以再取 \(x\) 的最优位置总会不优于 \(x\) 第一个最优位置。


然后考虑如下的递归 \(\operatorname{solve}(l_1,r_1,l_2,r_2)\) 过程:

  • 如果 \(l_2>r_2\) 返回;
  • 令 \(mid = \left\lfloor{l_2+r_2\over 2}\right\rfloor\),找到 \(mid\) 在 \([l_1,r_1]\) 的局部最优解(易证这里就是全局最优解)位置 \(p\)。
  • 递归求解 \(\operatorname{solve}(l_1,p,l_2,mid-1)\) 和 \(\operatorname{solve}(p,r_1,mid+1,r_2)\)。

插入完成后再求解逆序对数就做完了。复杂度容易证明是 \(\mathcal{O}((n+m)\log m)\)。

注意事项

求逆序对数组要开两倍。

My Code

标签:题解,位置,mid,operatorname,插入,solve,Insertion,CF1601C,逆序
来源: https://www.cnblogs.com/5ab-juruo/p/solution_cf1601c.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有