CF2165D Path Split 题解

news/2025/11/17 20:12:35/文章来源:https://www.cnblogs.com/Scarab/p/19234244

Description

给定一个长度为 \(n\) 的整数序列 \(a_1, a_2, \ldots, a_n\)

你希望把 \(a\) 划分成若干个子序列 \(b_1, b_2, \ldots, b_k\),并满足以下条件:

  1. \(a\) 中的每个元素恰好属于某个 \(b_i\)
  2. 对于每个子序列 \(b_i\),设其元素为 \(b_{i,1}, b_{i,2}, \ldots, b_{i,p_i}\)。那么对所有 \(1 \le j < p_i\),都必须满足 \(|b_{i,j} - b_{i,j+1}| = 1\)

请计算,将 \(a\) 划分成满足条件的子序列所需的最小数量。

\(1\leq n\leq 10^6\)

Solution

首先这题是个典型的最小链覆盖的问题,考虑转成二分图最大匹配的形式:对于每个 \(i\),建立左部点 \(L_i\) 和右部点 \(R_i\)。如果 \(i<j\)\(|a_i-a_j|=1\),则让 \(L_i\)\(R_j\) 连边。答案是 \(n-最大匹配\)

直接跑匹配显然是不行的,考虑将其转化为贪心。

我们枚举左部点,考虑为每个左部点找到与其匹配的右部点。

由于左部点中值为 \(1\) 的只能匹配 \(2\),而 \(3\) 能匹配 \(2\)\(4\),所以 \(3\) 强于 \(1\),那么一定是先为 \(1\) 找到匹配,再为 \(3\) 找到匹配。

而对于左部点的 \(2\)\(4\) 情况会不太一样,因为 \(2\) 能匹配 \(1\)\(3\)\(4\) 能匹配 \(3\)\(5\),此时 \(2\) 不止能匹配 \(3\)。但是注意到如果存在一个 \(1\) 没有和 \(2\) 匹配,那么这个 \(1\) 就不能被匹配了。所以策略是对于每个 \(2\),如果能匹配 \(1\),就找到离它最近的 \(1\) 匹配,否则就找最近的 \(3\) 匹配。

最终策略就是从小到大枚举左部点的权值 \(v\),如果当前位置 \(x\) 能和值为 \(v-1\) 的右部点匹配,就找最近的 \(v-1\) 匹配,否则找最近的 \(v+1\) 匹配。

时间复杂度:\(O(n\log n)\)

Code

#include <bits/stdc++.h>// #define int int64_tconst int kMaxN = 1e6 + 5;int n;
int a[kMaxN];
std::vector<int> pos[kMaxN * 2];
std::set<int> st[kMaxN * 2];void dickdreamer() {std::cin >> n;for (int i = 1; i <= 2 * n + 1; ++i) pos[i].clear(), st[i].clear();for (int i = 1; i <= n; ++i) std::cin >> a[i], pos[a[i]].emplace_back(i), st[a[i]].emplace(i);int ans = n;for (int i = 1; i <= 2 * n; ++i) {std::reverse(pos[i].begin(), pos[i].end());for (auto x : pos[i]) {auto it = st[i - 1].lower_bound(x);if (it != st[i - 1].end()) {--ans, st[i - 1].erase(it);} else {it = st[i + 1].lower_bound(x);if (it != st[i + 1].end()) --ans, st[i + 1].erase(it);}}}std::cout << ans << '\n';
}int32_t main() {
#ifdef ORZXKRfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);
#endifstd::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);int T = 1;std::cin >> T;while (T--) dickdreamer();// std::cerr << 1.0 * clock() / CLOCKS_PER_SEC << "s\n";return 0;
}

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

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

相关文章

gdb 安装linux

要安装 gdb(GNU Debugger)在 Linux 系统上,通常有以下几种方法,适用于大多数 Linux 发行版:? 方法 1:使用包管理器(推荐) 大多数 Linux 发行版都通过包管理器安装 gdb,例如: Debian/Ubuntu sudo apt update…

g for linux

看起来您可能输入有误,想问的是:+ #引号 + grep for linux + #引号 + 或 + #引号 + grep in linux + #引号 + ,这是在 Linux 中常用的命令,用于在文件中搜索特定字符串。? 一、grep 命令简介 grep 是 L…

人工智能之编程基础 Python 入门:第十章 文件读写

人工智能之编程基础 Python 入门:第十章 文件读写人工智能之编程基础 Python 入门 第十章 文件读写@目录人工智能之编程基础 Python 入门前言1. 基本文件操作1.1 打开文件:open()1.2 推荐方式:使用 with 语句(上下…

连续段 DP

连续段 DP 主要是做对于序列的计数类问题,其中对序列的限制一般是相邻数要满足一些条件。同时这个序列一般是一个排列。 连续段 DP 的主要思路是依照限制以此往序列里面填数。但是这个填数的过程是动态的,也就是我们…

深入探讨React源码与实现原理

我将从几个核心层面来展开,这也可以作为你自我审视和深入研究的路线图。 一、核心架构:Fiber 架构 这是现代React的基石。理解Fiber是理解一切新特性(如Concurrent Mode、Suspense)的前提。 你需要能清晰地阐述:F…

人工智能之编程基础 Python 入门:第九章 模块与包

人工智能之编程基础 Python 入门:第九章 模块与包人工智能之编程基础 Python 入门 第九章 模块与包@目录人工智能之编程基础 Python 入门前言模块1. 模块的基本概念什么是模块?2. 导入模块1. import 语句2. from ...…

基于Playwright + Allure + Pytest 企业级UI录制与回放自动化测试项目

基于Playwright + Allure + Pytest 企业级UI录制与回放自动化测试项目录制脚本: UI回放开始: 生成测试报告:

IM SDK选型避坑指南,2025年最新10家服务商稳定性排名

IM SDK选型避坑指南,2025年最新10家服务商稳定性排名随着移动互联网的深入发展,即时通讯已渗透到各行各业,从日常的社交聊天到关键业务的金融交易、远程医疗、在线教育,稳定可靠的IM服务成为保障用户体验和业务连续…

自定义yml激活进本地通用yml

自定义yml激活进本地通用yml 核心结论:自定义 YML 可通过「继承引用」「合并配置」或「指定加载顺序」三种方式,激活并复用本地通用 YML 的配置。 关键实现方式Spring Boot 场景(最常用):通用 YML 作为 base 配置…

AT_jsc2019_qual_e Card Collector

首先考虑什么情况不合法。假设 \(S\) 为选出卡片的集合,玩一下发现不合法当且仅当存在 \(T\subseteq S\),\(X=\{x|(x,y)\in T\}\),\(Y=\{y|(x,y)\in T\}\) 满足 \(|X|+|Y|<|T|\)。 假设当前需要加入一个点 \((x_…

人工智能之编程基础 Python 入门:第八章 函数与装饰器

人工智能之编程基础 Python 入门:第八章 函数与装饰器人工智能之编程基础 Python 入门 第八章 函数与装饰器@目录人工智能之编程基础 Python 入门前言函数1. 函数的定义与调用基本语法简单示例2. 函数的组成部分3. 参…

邻项交换

又称微扰法等 例题 最小化最大延迟惩罚 有 n 个任务,每个任务有一个有用时 \(p_i\) 和一个截止时间 \(d_i\),若完成时间为 \(c_i\),要最小化 \(max{c_i - d_i}\)。 考虑如果有两个相邻的 \(i\) 和 \(j\),不交换答案…

day26-MCP基础

MCP快速入门实战 一、MCP技术体系介绍 MCP,全称是Model Context Protocol,模型上下文协议,由Claude母公司Anthropic于2024年11月正式提出。MCP解决的最大痛点,就是Agent开发中调用外部工具的技术门槛过高的问题。 …

20232427 2025-2026-1 《网络与系统攻防技术》实验六实验报告

一、实验内容 本次实验聚焦 Metasploit 攻击渗透实践,核心内容包括两部分:一是前期渗透准备,通过主机发现、端口扫描及漏洞扫描获取靶机基础信息;二是漏洞渗透利用,针对 Metasploitable2 靶机的 4 类典型漏洞(Vs…

P9534 [YsOI2023] 广度优先遍历

考虑一个事情,把树建出来后,非树边都可以扔到后面去,这显然不影响答案。 思考为什么树边的顺序会影响答案,实质是因为一个结点 \(x\) 连了许多非树边,若是这些非树边先被访问了,那么 \(x\) 的父亲就要换了,因此…

2025-11-17 ZYZ28-NOIP模拟赛-Round7 hetao1733837的record

2025-11-17 ZYZ28-NOIP模拟赛-Round7 hetao1733837的record2025-11-17 ZYZ28-NOIP模拟赛-Round7 hetao1733837的record 好累😩 比赛链接:ZYZ28-NOIP模拟赛-Round7 - ZYZOJ A.pmst $( ‵▽′)ψ$$lz$竟然把原来的$T2…