设我们将要给出的观感好的排列为 \(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. 修改状态成边长至多是多少,同样这也是等价的,然后每次找矩形保留前若干大的矩形,听起来很离谱,但可能因为随机情况下确实这样可以抵达答案,可以通过。

「JOI Open 2022」Giraffes 题解的更多相关文章

  1. 【题解】LOJ2759. 「JOI 2014 Final」飞天鼠(最短路)

    [题解]LOJ2759. 「JOI 2014 Final」飞天鼠(最短路) 考虑最终答案的构成,一定是由很多飞行+一些上升+一些下降构成. 由于在任何一个点上升或者下降代价是一样的,所以: 对于上升操 ...

  2. 「JOI 2017 Final」JOIOI 王国

    「JOI 2017 Final」JOIOI 王国 题目描述 题目译自 JOI 2017 Final T3「 JOIOI 王国 / The Kingdom of JOIOI」 JOIOI 王国是一个 H ...

  3. 「JOI 2015 Final」分蛋糕 2

    「JOI 2015 Final」分蛋糕 2 题解 这道题让我想起了新年趣事之红包这道DP题,这道题和那道题推出来之后的做法是一样的. 我们可以定义dp[i][len][1] 表示从第i块逆时针数len ...

  4. LOJ#2351. 「JOI 2018 Final」毒蛇越狱

    LOJ#2351. 「JOI 2018 Final」毒蛇越狱 https://loj.ac/problem/2351 分析: 首先有\(2^{|?|}\)的暴力非常好做. 观察到\(min(|1|,| ...

  5. 【LOJ】#3014. 「JOI 2019 Final」独特的城市(长链剖分)

    LOJ#3014. 「JOI 2019 Final」独特的城市(长链剖分) 显然我们画一条直径,容易发现被统计的只可能是直径某个距离较远的端点到这个点的路径上的值 用一个栈统计可以被统计的点,然后我们 ...

  6. 「JOI 2014 Final」飞天鼠

    「JOI 2014 Final」飞天鼠 显然向上爬是没有必要的,除非会下降到地面以下,才提高到刚好为0. 到达一个点有两种情况:到达高度为0和不为0. 对于高度不为0的情况,显然花费的时间越少高度越高 ...

  7. 「JOI 2015 Final」城墙

    「JOI 2015 Final」城墙 复杂度默认\(m=n\) 暴力 对于点\((i,j)\),记录\(ld[i][j]=min(向下延伸的长度,向右延伸的长度)\),\(rd[i][j]=min(向 ...

  8. 「JOI 2015 Final」舞会

    「JOI 2015 Final」舞会 略微思考一下即可知该过程可以化为一棵树.(3个贵族中选择1个,即新建一个节点连向这3个贵族). 该树的结点个数为\(2n\). 考虑二分答案mid. 判定的是公主 ...

  9. [题解] [LOJ2743]「JOI Open 2016」摩天大楼

    题目大意 将 \(N\) 个互不相同的整数 \(A_1 , A_2 , ⋯ , A_N\) 任意排列成 \(B_1 , B_2 , ⋯ , B_N\) . 要求 \(∑^{N−1}_{i=1} |B_ ...

  10. LOJ#2764. 「JOI 2013 Final」JOIOI 塔

    题目地址 https://loj.ac/problem/2764 题解 真的想不到二分...不看tag的话... 考虑二分答案转化为判定问题,那么问题就变成了能不能组合出x个JOI/IOI,考虑贪心判 ...

随机推荐

  1. 【Java】线程池梳理

    [Java]线程池梳理 前言 线程池:本质上是一种对象池,用于管理线程资源.在任务执行前,需要从线程池中拿出线程来执行.在任务执行完成之后,需要把线程放回线程池.通过线程的这种反复利用机制,可以有效地 ...

  2. 题解 CF1579G Minimal Coverage

    CF1579G Minimal Coverage dp好题! link to the problem 解法 首先需要观察到:如果最长线段的长度为\(maxL\),那么答案不可能超过\(2maxL\) ...

  3. flutter_swiper:Another exception was thrown: ScrollController attached to multiple scroll views.

    Another exception was thrown: ScrollController attached to multiple scroll views. 翻译一下:引发了另一个异常:Scro ...

  4. 反射概述-获取字节码Class对象的三种方式

    反射概述 判定结果∶*红色:失败*绿色:成功*一般我们会使用断言操作来处理结果*Assert.assertEquals(期望的结果,运算的结果);补充∶*Before:*修饰的方法会在测试方法之前被自 ...

  5. 【开源】libserial_parse_text:命令行解析的基础库

    借助五一假期,写了一个命令行解析的基础库,一般可用于串口命令解析.TCP命令解析等等. 具有以下几种特点: 不涉及到具体硬件, 纯软件协议,与具体硬件分离. 支持不定长命令行,逐个字符解码,可以支持不 ...

  6. Spring中常见的注解

    1.组件注解 @Controller @Service @Repository @Component ---标注一个类为Spring容器的Bean @Configration ---声明当前类为配置类 ...

  7. HOMER docker版本安装详细流程

    概述 HOMER是一款100%开源的针对SIP/VOIP/RTC的抓包工具和监控工具. HOMER是一款强大的.运营商级.可扩展的数据包和事件捕获系统,是基于HEP/EEP协议的VoIP/RTC监控应 ...

  8. Spring框架JDBC

    *Spring框架对JDBC进行简单的封装.提供了一个JDBCTemplate对象简化JDBC的开发 *步骤: 1.导入jar包 2.创建JDBCTemplate对象,以来与数据源DataSource ...

  9. Makefile常用命令

    # 下面用来定义变量并赋值 # := 和 = 一样的吗? # 这里?=代表如果变量已经赋值了,不要重新赋值,而是保留原来的值 CROSS_COMPILE ?= arm-linux-gnueabihf- ...

  10. kali linux 使用教程

    kali linux使用教程 前言:Kali Linux 是专门用于渗透测试的linux操作系统,它由BackTrack发展而来,在整合了IWHAX.WHOPPIX和Auditor这三种渗透测试专用L ...