设我们将要给出的观感好的排列为 \(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. Spring中11个最常用的扩展点,你知道几个?

    前言 在使用spring的过程中,我们有没有发现它的扩展能力很强呢? 由于这个优势的存在,使得spring具有很强的包容性,所以很多第三方应用或者框架可以很容易的投入到spring的怀抱中.今天我们主 ...

  2. 我的第一个自动刷作业脚本(大起大落的selenium经验分享)

    起因 故事的开始是大二的上学期,有一门叫计算机结构(computer organization)的课.新教授这门课的教授在原来的政策上做了一些变动.他引入了一个叫做zybook的作业平台来确保我们能跟 ...

  3. python之路39 前端开始 各种标签

    前端前夕 前端三剑客 HTML 网页的骨架 CSS 网页的样式 JavaScript 网页的动态 1.编写服务端 2.浏览器充当客户端访问服务端 3.浏览器无法正常展示服务端内容(因为服务端得数据没用 ...

  4. 代码小DEMO随笔---JS原生手机版本alert弹框

    之前的随笔写的是WEB版本的弹框,这次是手机版本,欢迎路过的大佬们提出更好的写法~~ <!DOCTYPE html> <html lang="en"> &l ...

  5. Java 进阶P-1.1+P-1.2

    用类制造对象 对象与类 对象是实体,需要被创建,可以为我们做事情 类是规范,根据类的定义来创建对象 对象=属性+服务 数据:属性或状态 操作:函数 从这些例子可以看出来 class是提供服务的,数据是 ...

  6. springboot输出json日志

    <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-lo ...

  7. SpringCloud 消费请求Eureka调用服务提供者报错

    SpringCloud 消费请求Eureka调用服务提供者报错 springCloud 2022.0.1 springboot 3.0.2 消费程序 通过eureka集群查询服务,根据eureka中注 ...

  8. Element-Ui表单移除校验clearValidate和resetFields

    添加和修改公用一个弹窗,点击添加弹窗后,如果没移除表单校验的话,再点击修改弹窗时校验就会被记住,所以需要移除校验,但在清空表单校验时会报如下错误: 那么,你只需要加上这段话即可 this.$nextT ...

  9. 编译报错,提示:This dependency was not found:* vue-editor-bridge

    前端代码引入了: 1 import func from 'vue-editor-bridge'; 工具自动填充,导致引入上述JS去掉重新编译,问题解决

  10. 修改Element - plus的样式

    把显示再浏览器上的对应css选择器全部写上,并且添加 !important </script> <style lang='scss' scoped> //修改 element ...