设我们将要给出的观感好的排列为 \(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. 利用Git同步思源笔记

    旧文章从语雀迁移过来,原日期为2022-10-22 思源笔记是一款优秀的本地优先的双链大纲笔记软件,拥有强大的笔记编辑功能且都是免费,唯一付费的就是云同步等一些服务了.但如果暂时还用不着云同步的,我们 ...

  2. CH334、CH335USB2.0Hub芯片(更新ing)

    USB HUB又称USB集线器,主要用于USB主机端口扩展,广泛应用于计算机,笔记本,及周边应用.CH334.CH335是符合 USB2.0 协议规范的高性能MTT 4 端口 USB2.0  HUB  ...

  3. 【架构设计】保持简单轻量设计的三个原则——DRY,KISS, YAGNI

    前言 一个软件轻量简单的软件架构是非常重要的,它可以让我们花最小的代价就能满足业务上的需求.那如何保证轻量简单呢?那今天就和大家分享下这其中的秘密,也就是3个重要的指导原则,KISS原则,YAGNI原 ...

  4. [python] NetworkX实例

    文章目录 NetworkX实例 1. 基础Basic 2. 绘图Drawing 3. 图标Graph NetworkX实例 代码下载地址 NetworkX 2.4版本的通用示例性示例.本教程介绍了约定 ...

  5. css边框,盒子模型、浮动、定位

    边框,盒子模型.浮动.定位 一.边框 border-width : 边框宽度 border-style : 边框样式 1.solid 实线 2.none 无边框 3.dotted 点状虚线边框 4.d ...

  6. ubuntu下yaml-cpp安装与使用

    安装 从GitHub上下载源码编译安装:git clone https://github.com/jbeder/yaml-cpp.git: 进入源码目录并创建一个 build 目录:cd yaml-c ...

  7. GDOI 2021 PJ 总结

    Day 0.5 在门口等了好久,终于进去了. Day 1 下午来到考场,发现自己承诺书没有拿,然后就跑到宿舍去拿,回来发现只要身份证. T1一眼是个博弈,发现不太好打,先跳. T2发现最多消耗4320 ...

  8. App测试Android的闪退总结

    Android的闪退有三种情况: 第一种:没有任何弹框提示,直接退出 第二种:有弹框提示程序异常 第三种:ANR无响应 三种情况的日志提交和检索方法:  第一种情况:是底层C挂了 **首先:提交客户端 ...

  9. nginx微信对接

    location /MP_verify_l47ZUDtvieeDlVWR.txt { default_type text/html; return 200 'l47ZUDtvieeDlVWR'; }

  10. Mybatis获取插入值的ID

    需求: 在后台做多次插入的时候,需要使用返回ID,然而普通的操作是无法做到的 Mybatis可以在insert的标签 上加上 keyProperty='id' useGeneratedKeys=&qu ...