UTS Open 21 P6 - Terra Mater

news/2025/1/18 17:58:36/文章来源:https://www.cnblogs.com/keysky/p/18678669

传送门

前言

本题是一道很好的“dp”题,无论是正难反易,还是模型转化都值得称赞,尤其是最后的神之一手,让我大脑宕机。

题意描述

给定一个长度为 \(N\) 的序列 \(H\),修改不超过 \(K\) 个数,使得 \(\max_{1}^{N - 1}{H_{i + 1} - H_i}\) 最小。
\(2 \le N \le 2 \times 10^5\)\(0 \le K \le N\)\(1 \le H_i \le 10^9\)

思路推导 & 做法

首先,对于这一类最大值最小的问题,我们有一个模板化的思考方向——二分答案,在尝试后,发现对于该题在确定答案后再判断是否有解是有用的,因为答案限制了相邻 \(H_i\) 的取值,同时并没有什么可贪心或能转化为图论的地方,所以考虑 \(\text{dp}\) check。
然后怎么做呢?在思考良久后,发现这道题很难(这不废话吗),连暴力 \(\text{dp}\) 都打不出来。直接硬做做不出来,就要思考如何把题目进行转化以降低难度。此时就要发挥你惊人的注意力,像瞪几何大题一样敏锐地发现直接做做不出来的原因在于若该修改 \(i\) 你在 \(i + 1\) 就不知道上一个选了什么数也无法定义进状态里,所以就要把从某个地方转移过来的数固定下来,所以就要将“不修改”放进 \(\text{dp}\) ,也就是正难反易,于是定义 \(dp_i\) 表示考虑完前 \(i\) 座山丘,第 \(i\) 座山丘不修改,最多能有多少座山丘不修改。
考虑状态转移,设二分的答案为 \(danger\),若 \(2\) 座山丘 \(i, j (j < i)\) 都不修改,则要满足对于山丘 \(k \in (j, i)\) 都修改的情况下,也就是最容易满足的情况下能满足条件,即 \(|H_i - H_j| \le danger \times (i - j)\) 。所以有如下 \(\text{dp}\) 转移式:

\[dp_i = \max_{j \in [1, i) \wedge |H_i - H_j| \le danger \times (i - j)}{dp_j + 1} \]

目前我们有了 \(O(N^2 \log {10^9})\) 的做法,但这明显不够,所以我们要把 \(\text{dp}\) 优化进 \(O(N \log N)\) 及以内。
现在我们要从状态转移方程入手,发现其中最不规整也最难优化的是 \(|H_i - H_j| \le danger \times (i - j)\) 这一个条件,绝对值的存在让我们不能轻易优化,所以要拆绝对值,条件就变成了

\[H_i - H_j \le danger \times (i - j) \wedge H_j - H_i \le danger \times (i - j) \]

再将具有同一变量的值移到同侧,变为

\[danger \times j - H_j \le danger \times i - H_i \wedge danger \times j + H_j \le danger \times i + H_i \]

发现所有与 \(j\) 有关的和与 \(i\) 有关的都分列两侧,所以可以另定义权值,把条件变漂亮。定义 \(X_i = danger * i\) ,定义 \(v_i \ge v_j\)\(X_i - H_i \ge X_j - H_j 且 X_i + H_i \ge X_j + H_j\) (这式子好整齐啊,要不是我推出来的一定还有转化),反之为 \(\le\) ,问题就转化为给定长度为 \(n\) 的序列 \(v\) ,求该序列的最长不下降子序列
当你做到这一步时大抵是会欣喜若狂像我一样 ,以为马上就切掉这道题了,但好题就是好题,总在你得意忘形时给你沉重一击(笑容凝固)。你惊世骇俗地发现加上 \(i\) 这一维下标后就变成了三维偏序,解决的经典办法是CDQ分治或二维树状数组,但 \(O(N \log^2 N)\),总时间 \(O(N \log^2 N log 10^9)\) ,然后你的动作be like:Win + R ——calc——\(200000 \times (\frac{log_{10}^{200000}}{log_{10}^{2}})^2 \times \frac{log_{10}^{10^9}}{log_{10}^{2}} = 1854230461.3827186693864795412925\dots\) ,随即亲切地问候了出题者的祖宗苦思冥想,始终不得其解。

神之一手

我翻开算法圣经(蓝本)一查,这三维偏序没有界限,歪歪斜斜的每页上都写着CDQ分治几个字。我横竖想不通,仔细看了半日,才从字缝里看出来,满本都写着两个字是 \(O(N \log^2 N)\)

当你接近崩溃的时候,你忽地想起了推出的式子和心中的想法,抱着试一试的心态去推了一下式子进行转化(回收伏笔),脑袋里还想着什么高深算法,把三减个一变成二,突然发现答案就在笔下。
\(v_j \ge v_i (j < i)\) ,则

\[X_j - H_j \ge X_i - H_i \]

\[X_j + H_j \ge X_i + H_i \]

变形得

\[H_i - H_j \ge X_i - X_j \]

\[H_i - H_j \le X_j - X_i \]

\(X_i,X_j\) 还原回去

\[H_i - H_j \ge danger \times (i - j) > 0 \]

\[H_i - H_j \le danger \times (j - i) < 0 \]

\[矛盾! \]

所以我们可以得出若 \(j < i\)\(v_j \le v_i\) ,所以当交换 \(v_j, v_i\) 后(权值不变),\(dp_i\) 一定不对 \(dp_j\) 产生贡献,所以交换两个数后答案一定不会变大。
\(v_i \ge v_j (j < i)\) ,则

\[X_i - H_i \ge X_j - H_j \]

\[X_i + H_i \ge X_j + H_j \]

由此得出如果按某一维排序后 \(dp_j\) 仍然在 \(dp_i\) 前且一定满足 \(v_i \ge v_j\)\(dp_i\) 仍然可以从 \(dp_j\) 转移,所以原本可转移的方向现在仍然存在,故排序后答案不会变小。
交换 \(v_i, v_j\) 后答案不变大又可以缩小范围为对 \(v\) 排序后答案不变大,此时答案也不变小,所以任意按某一维排序后答案不变!!!
这神之一手直接把索引 \(i\) 的一维砍掉,成功把三维偏序转化为二维偏序,直接用 \(\text{LIS}\) 模板树状数组即可。

solution

思路想通后代码异常简单。

/*
address:https://dmoj.ca/problem/utso21p6
AC 2025/1/11 16:49
*/
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) (x & -x)
const int N = 2e5 + 5;
int n, k;
int h[N];
struct BinaryTree {int c[N];inline void init(int n) { fill(c + 1, c + n + 1, 0); }inline void change(int x, int k) { for (;x <= n;x += lowbit(x)) c[x] = max(c[x], k); }inline int query(int x) {int ret = 0;for (;x > 0;x -= lowbit(x)) ret = max(ret, c[x]);return ret;}
}BIT;
typedef long long LL;
pair<LL, LL>a[N];
LL disc[N];
int dp[N];
inline bool check(int danger) {BIT.init(n + 1);for (int i = 1;i <= n;i++) a[i] = { 1ll * danger * i - h[i],1ll * danger * i + h[i] };sort(a + 1, a + n + 1);for (int i = 1;i <= n;i++) disc[i] = a[i].second;sort(disc + 1, disc + n + 1);int m = unique(disc + 1, disc + n + 1) - disc - 1;for (int i = 1;i <= n;i++) a[i].second = lower_bound(disc + 1, disc + m + 1, a[i].second) - disc;for (int i = 1;i <= n;i++) {dp[i] = BIT.query(a[i].second) + 1;BIT.change(a[i].second, dp[i]);}for (int i = 1;i <= n;i++)if (dp[i] >= n - k) return true;return false;
}
int main() {int T;scanf("%d", &T);while (T--) {scanf("%d%d", &n, &k);for (int i = 1;i <= n;i++) scanf("%d", &h[i]);int l = 0, r = 1e9, ans = 1e9;while (l <= r) {int mid = l + r >> 1;if (check(mid)) r = mid - 1, ans = mid;else l = mid + 1;}printf("%d\n", ans);}return 0;
}

总结

这道题单说前几步难度就已经很大了,最后出题者的阴险巧妙构思画龙点睛,让这道题的难度更上一层。这种巧妙的题还是少见,值得珍惜。
同时也明白了莫要

只言片语尽显高见, 行动却似矮人观场

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/871328.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「NOIP2024」 树上查询

update 2024/12/28 题目描述 给定一棵树,每次询问区间 \([l,r]\) 的 \[\max_{l \le l \le r \le r \land r - l + 1 \ge k}\text{dep}_ {\text{LCA*}(l, r)} \]引理证明 先来证两个区间 \(\text{LCA}\) 的引理: 对于 \(\text{LCA} \{ l, l + 1, \dots r\}\) 我们有 \(\text{L…

Flask Web开发实战:入门、进阶与原理解析PDF免费下载

PythonWeb框架Flask开发团队成员撰写,内容全面,从基础知识到进阶实战,再到源码分析,提供完善的Flask学习路径适读人群 :本书适合了解Python基本语法,想要自己动手做网站的编程人员;熟悉Python。想要从事Python Web开发的后端工程师、运维工程师和爬虫工程师;香葱Django…

CMU 15-445 23Fall总结

注:编译、测试之前运行sudo sysctl vm.mmap_rnd_bits=28 BusTubs architecture: 1. Query Processing (查询处理层) 负责将输入的 SQL 查询转化为可执行的物理查询计划。Parser(解析器):将输入的 SQL 字符串解析为抽象语法树 (AST),检查 SQL 语法是否合法。 Binder(绑定器…

从数据到模型,足球预测方法解析

在足球赛事范畴内,比赛结局始终蕴含着诸多不确定性,而这恰恰构成了足球独特的魅力要素。对于广大球迷而言,尝试预测足球比赛的最终结果,向来是一项极具吸引力与挑战性的活动。 近年来,伴随数据科学以及机器学习技术的迅猛发展,足球预测领域发生了深刻变革。这些先进技术为…

传奇三虚拟机服务端-客户端win10可用

论坛转来的,还没有实验架设 传奇3 虚拟机服务端一键架设。。。好吧,三键架设,据说WIN10可玩服务端启动稍微有点步骤,还算简单吧QQ截图20200414142743.jpg (73.53 KB, 下载次数: 0)下载附件2020-4-14 14:41 上传QQ截图20200414142828.jpg (74.73 KB, 下载次数: 0)下载附件20…

THREE.js学习笔记9——Materials

这一小节主要学习材质 材质用于为几何物理模型的每个可见像素添加颜色。 Materials are used to put a color on each visible pixel of the geometries. 决定每个像素颜色的算法是在程序中编写的,称为着色器。 Three.js 具有许多带有预制着色器的内置材料。 Algorithms that …

[HarekazeCTF2019]baby_rop2(read的libc)

一个normal的栈溢出,没有system和binsh,为ret2libc 这里也没有常见的write和puts,所以我们用read泄露libc基址,并使用printf打印read的地址 这里注意printf的第一个参数必须是格式字符串,即Welcome to the Pwn World again(地址为0x0400770,第二个参数设为read_got(got表…

Living-Dream 系列笔记 第93期

最大流 EK & Dinic本文讲解 EK & Dinic 算法。 最大流 最大流的模型:特别注意:这个流量上限不是单次流量不超过它,而是多次的总和不超过它。 EK 显然这个问题是可以使用 dfs 解决的,但是效率低下。 考虑如下的图。我们发现 dfs 有可能走了 \(S \to A \to B \to T\)…

【每日一题】20250118

我是时间唯一的主人。成为自己的时间的主人是一种奢侈。我认为这是人类能够送给自己的最奢侈的东西之一。【每日一题】 1.(16分) \(\hspace{0.6cm}\)如图所示,在以坐标原点 \(O\) 为圆心、半径为 \(R\) 的半圆形区域内,有相互垂直的匀强电场和匀强磁场,磁感应强度为 \(B\),…

思通数科舆情监测系统:精准实现数据监测与实时预警的应用意义

随着信息化社会的深入发展,舆情管理变得愈加复杂,尤其是在社交媒体和网络平台的广泛应用下,信息传播的速度与影响力呈现出指数级增长。如何高效监测和分析这些海量数据,成为各级政府、企业和公共机构亟待解决的问题。思通数科的舆情监测系统,凭借强大的数据监控与分析能力…

中考英语优秀范文-热点话题-传统文化-009 Dragon Boat Festival 端午节

1 写作要求 为弘扬中华传统文化,增强文化自觉,学校将举行一次英语演讲比赛。请以“ ___________Festival”为题,写一篇演讲稿,介绍一个你最喜欢的中国传统节日。 提示问题: What is your favorite traditional festival? Can you say some basic facts about it? How do…

在线json调试工具

在线json格式化工具,无需登录,打开即用 https://json.openai2025.com/