ICode9

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

LOJ#535「LibreOJ Round #6」花火 题解

2022-07-27 19:34:47  阅读:161  来源: 互联网

标签:limits LibreOJ LOJ 题解 交换 满足 集合 矩形 逆序


题面

如果只能交换相邻两项,那么答案就是排列的逆序对数。

现在我们就是要求交换两个数,使得交换后的排列逆序对数最少。

不难发现我们一定不会交换满足 \(i<j,h_i<h_j\) 的 \((i,j)\),因为这样只会让逆序对变多。

考虑怎么刻画减少的逆序对:

  • \((i,j)\);
  • 满足 \(i<k<j,h_k<h_i\) 的 \((i,k)\);
  • 满足 \(i<k<j,h_k>h_j\) 的 \((k,j)\)。

如果我们把每一个位置看出一个二维平面上的点 \((i,h_i)\),那么后两类减少的逆序对就可以很好地被刻画为 $2\times $ 以 \((i,h_i)\) 为左上角、\((j,h_j)\) 为右下角的矩形内部(不算边界)的点的数量。

所以我们就要找到一个包含点数最多的矩形。

容易想到被另一个矩形包含的矩形一定不优,也就是说我们的左上角只会选择满足 \(h_i=\max\limits_{a=1}^i h_a\) 的 \((i,h_i)\)(设所有满足该条件的点组成的集合为 \(L\))、右下角只会选择满足 \(h_j=\min\limits_{b=j}^n h_b\) 的 \((j,h_j)\)(设所有满足该条件的点组成的集合为 \(R\)),这个可以 \(O(n)\) 直接求出。

发现这样似乎还是不太好做,考虑换一种想法:求覆盖一个点的点数最多的矩形。

由于 \(L\) 和 \(R\) 中的 \(h\) 随着 \(i\) 的增大而增大,那么对于一个点 \((k,h_k)\),我们可以二分找到 \(L\) 集合中第一个纵坐标 \(>h_k\) 的点 \((l,h_l)\) 和 \(R\) 集合中最后一个纵坐标 \(<h_k\) 的点 \((r,h_r)\),则所有左上角的横坐标在 \([l,k-1]\) 区间内、右下角的横坐标在 \([k+1,r]\) 区间内的矩形都会覆盖这个点。

那么就可以转化成二维数点问题,扫描线即可。

代码:https://paste.ubuntu.com/p/Wz6g4Rvxzq/

标签:limits,LibreOJ,LOJ,题解,交换,满足,集合,矩形,逆序
来源: https://www.cnblogs.com/xsl19/p/loj535_sol.html

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

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

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

ICode9版权所有