首页 > 其他分享 >「JOI Open 2022」Giraffes 题解

「JOI Open 2022」Giraffes 题解

时间:2023-01-10 20:23:40浏览次数:67  
标签:题解 可以 sqrt LDS LIS JOI 矩形 Open DP

设我们将要给出的观感好的排列为 \(q\),我们希望求出 \(\sum[p_i=q_i]\) 的最大值(这里指不移动的长颈鹿个数)。

结论一:当且仅当左右端点有当前区间最大值或者最小值时条件才能成立。

证明可以考虑反证,此处略去。

据此可以写出 \(O(4^n)\) 暴力,每次枚举当前区间对应值域最大值/最小值填在左端点/右端点处即可。

考虑 DP,可以设计状态 \(f_{l,r,x,y}\) 表示 \([l,r]\) 填了 \([x,y]\),注意到 \(y\) 不是必需的,暴力转移就可以做到 \(O(n^3)\)。


抛开如何优化这个问题不谈,我们来讨论一下上面的结论在平面的等价描述。

在平面标记点 \((i,q_i)\),考虑一个大小为 \(n\times n\) 的,以 \((1,1)\) 为右下角的正方形,其刚好包括所有被标记的点,那么实际上,结论也就意味着,所有合法的 \(q\) 可以经过「每次去掉正方形一角的点,并且同时缩小正方形至 \((n-1)\times (n-1)\),使这个正方形包含剩余的点」这个过程使得正方形可以缩减成一个点。

借用官方题解的一张图来描述一下这个过程,如图 \(q=\{6,1,3,2,4,5\}\):

对于原先的排列 \(p\),就要对于每个 \(q\) 的这个缩减过程,求其不被经过的点的个数的最小值。

那么这个 DP,意味着当前对于某个合法的排列 \(q\),一个左下角为 \((l,x)\) 边长为 \(r-l+1\) 的合法正方形正要被缩小,而在缩小的过程中我们可以反向构造出 \(q\)。


下面我们来讨论一下如何优化这个 DP,首先的第一步是,数据随机是为了什么?

结论二:不被移动的长颈鹿个数不会超过 LIS 和 LDS 大小的总和。

证明:反过来考虑一整个上面的过程可以发现每个合法的 \(q\) 一定可以被拆成一个上升子序列(下文简称 IS)和一个下降子序列(下文简称 DS),具体构造如下:

  • 反过来考虑上面的缩减过程,改为扩充。
  • 如果扩充左上角或是右下角,将其加入 IS。
  • 否则,加入 DS。

贪心的想,既然每个合法的 \(q\) 可以被拆成一个 IS 和一个 DS,那么对于原本的 \(p\),我们希望固定住尽可能长的 IS 和 DS,即 LIS 和 LDS,而将其他的元素打乱加入 LIS 和 LDS,故 LIS 和 LDS 大小的总和是一个合法上界。

结论三:LIS 和 LDS 的大小在随机情况下是 \(O(\sqrt{n})\) 级别的。

相信这是 Well-Known 的结论,不需要证明,想看证明可以到 Link


据此我们可以知道这样一件事情,我们的 \(f_{l,r,x,y}\) 或者说是 \(f_{l,r,x}\) 的值域是 \(O(\sqrt{n})\) 的,这就引发我们思考是否可以通过换维的方法来优化 DP,当然这是可行的。

改变 DP 状态,记 \(f_{i,j,k}\) 表示,一个以 \((i,p_i)\) 为一角的矩形向四个方向(用 \(j\) 表示),包含至多 \(k\) 个标记点,这个矩形的边长至少是多少。

\(k\) 是 \(O(\sqrt{n})\) 级别的,所以暴力枚举 \(k\),对于 \(k-1\) 情况下的若干个矩形,如果存在某个矩形位于 \(f_{i,j,k}\) 的转移范围内直接转移即可。

这样子时间复杂度可以到达 \(O(n^2\sqrt{n})\)。

实现可以看 Link,有参考官方题解。

最后一步有两种方向:

  1. 注意到转移是类似于「平面上有若干个矩形,询问某个范围内是否有矩形」这样的问题,这是扫描线可以解决的范畴,沿对角线扫描线即可,\(O(n\sqrt{n}\log n)\),我没写。
  2. 修改状态成边长至多是多少,同样这也是等价的,然后每次找矩形保留前若干大的矩形,听起来很离谱,但可能因为随机情况下确实这样可以抵达答案,可以通过,Link

标签:题解,可以,sqrt,LDS,LIS,JOI,矩形,Open,DP
From: https://www.cnblogs.com/cnyzz/p/17041278.html

相关文章

  • 题解1
    离散化1.为什么要离散化当数据很大的时候,以至于我们不能直接使用它的时候,就要考虑将其用另外一种形式表达,通常是将其映射为数组下标。2.离散化本质本质:映射3.离......
  • charls抓包的乱码问题解决
    1.在charls的安装目录下,去修改配置文件的值----Charles.ini,内容如下   2.SSLproxysetting设置如下图  3.顺便说一下,charls抓取https的包,一定要先安......
  • openEuler社区开源项目:CPDS(容器故障检测系统)介绍
    容器故障检测系统CPDS(ContainerProblemDetectSystem)是由北京凝思软件股份有限公司(以下简称“凝思软件”)设计并开发的容器集群故障检测系统,该软件系统实现了对容器TO......
  • docker中crontab无法执行导入计划任务问题解决
    问题描述:crontab无法执行导入计划任务解决: ⊙查看文件16进制 hexdump-c./crontab/defalut   发现有\r;crontab中只能直接\n⊙vim文件修改编码   setfile......
  • P3521 题解
    非线段树合并做法。复杂度多一只log,但是好写。跳过不重要的部分,直达核心——如何在递归时计算两棵子树互相的贡献?题解区清一色线段树合并从值域角度考虑。但是显然倍......
  • 软件测试最常用的 SQL 命令(二) | 高级 Join 多表查询
    INNERJOIN:如果表中有至少一个匹配,则返回行LEFTJOIN:即使右表中没有匹配,也从左表返回所有的行RIGHTJOIN:即使左表中没有匹配,也从右表返回所有的行FULLJOIN:只要其中一个表中......
  • [IOI2000]邮局 题解
    简要题意线段上有\(V\)个村庄,现在要建\(P\)个邮局,使每个村庄到最近的邮局的距离之和最小。50分做法设\(dp[i][j]\)表示第一个村庄到第\(i\)个村庄,建了\(j\)个......
  • 聚焦操作系统迁移实践与生态发展 | openEuler Meetup 长沙站圆满结束
    活动回顾12月23日,由openEuler社区和湖南欧拉生态创新中心主办,麒麟信安和湖南省鲲鹏生态创新中心协办的openEuler Meetup 长沙站举办。本次活动集聚社区开发者、用户、企业......
  • openEuler RISC-V 的 Firefox 性能大升级,最高 40 倍性能提升
    RISC-VSIG择日即将发布openEulerRISC-V22.03V2版本镜像。本次发版会提供带有SpiderMonkeyJIT编译支持的Firefox最新版本和带有LLVMpipe优化的Mesa最新版本......
  • mysql delete大量数据表锁死,kill的线程后线程处于killed状态问题解决
    一、事件起因删除一张500G的表,没有添加任何约束条件,结果好久都没反应,查询锁之后,使用kill杀掉了进程,再次查询的时候,锁还在,trx_state的状态是ROLLINGBACK,使用showprocessl......