[ARC195D] Swap and Erase 分析

news/2025/11/20 22:35:56/文章来源:https://www.cnblogs.com/high-sky/p/19249781

题目概述

给定一个数列 $ A = (A_1, \ldots, A_N) $。你可以对 $ A $ 进行以下两种操作,顺序和次数不限:

  1. 交换操作:设操作前 $ A $ 的长度为 $ K $。选择满足 $ 1 \leq i \leq K - 1 $ 的整数 $ i $,交换 $ A $ 的第 $ i $ 项和第 $ (i+1) $ 项。
  2. 删除操作:设操作前 $ A $ 的长度为 $ K $。选择满足 $ 1 \leq i \leq K $ 且 $ A $ 的前 $ i $ 项全部相等的整数 $ i $,删除 $ A $ 的前 $ i $ 项。

请求出将 $ A $ 变为空数列所需的最小总操作次数。

赛时思路

考虑了一个可以通过交换操作进行优化的序列(分 \(x\) 个连通块):

1 2 1 21 2 1 3 2 31 2 1 3 2 4 3 41 2 1 3 2 4 3 5 4 5

这个是很有启发的,但是赛时没有考虑更加普遍的情况,因此无了。

分析1:普通 \(dp\) 做法

这个可以加上区间加和区间覆盖变成一道动态 \(dp\) 的题目(也就是我们的模拟赛题目)。

我们一定是先交换完然后再一次性消掉嘛。

考虑什么时候交换是有用的。

比方说下面这种情况:

1 2 1 2

那么我们可以考虑中间的 \(1\)\(2\) 交换可以得到更优的答案 \(3\) 而不是直接消掉的 \(4\)

考虑到可能有些交换是无意义的假设有 1 2 2 1,那么将后面的那一个 \(1\) 交换到前面是没有意义的,因为交换就是为了让我们的操作二尽量更少而且少得要比操作一的次数多才对我们的答案有利。

我们如果一个数交换了两次,那么最多影响的是当前这个数和交换的两个数中的一个,对答案显然不会更优。

因此我们得出结论:每个数最多只是会被交换 \(1\)

考虑依据这个进行 \(dp\),于是设 \(f_{i,0/1}\) 表示考虑到第 \(i\) 个数,当前这个数与前面的数是换还是不换。

对于 \(f_{i,0}\) 有:

\[f_{i,0}=\min\{f_{i-1,1}+[a_i\ne a_{i-2}],f_{i-1,0}+[a_i\ne a_{i-1}]\} \]

对于 \(f_{i,1}\),我们从 \(i-2\) 转移过来,因为从 \(i-1\) 的话一旦考虑了顺序问题那么必定有一个数会被交换两次:

\[f_{i,1}=1+\min\{f_{i-2,0}+[a_i\ne a_{i-2}]+[a_i\ne a_{i-1}],f_{i-2,1}+[a_{i}\ne a_{i-3}]+[a_i\ne a_{i-1}]\} \]

代码1

时间复杂度 \(\mathcal{O}(n)\)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <algorithm>
#include <vector>
#define int long long
#define N 200005
using namespace std;
int T,n,a[N],f[N][2];
signed main(){cin >> T;for (;T--;) {scanf("%lld",&n);for (int i = 1;i <= n;i ++) scanf("%lld",&a[i]);f[1][0] = 1,f[1][1] = 1e18;for (int i = 2;i <= n;i ++) {f[i][0] = min(f[i - 1][0] + (a[i] != a[i - 1]),f[i - 1][1] + (a[i] != a[i - 2]));if (i >= 2) f[i][1] = 1 + (a[i] != a[i - 1]) + min(f[i - 2][0] + (a[i] != a[i - 2]),f[i - 2][1] + (a[i] !=a[i - 3]));}printf("%lld\n",min(f[n][0],f[n][1]));}return 0;
}

分析2:贪心+模型构造

我们继续在块为 \(2\) 之后(也就是 \(3\))考虑。

1 2 1 3 2 3

我们可以交换第 \(2,3\) 个数然后交换第 \(4,5\) 的数可以得到更优的答案。

于是我们抽离模型:a b c d,并且钦定交换 b c 而且 \(a\ne b,b\ne c,c\ne d\),因为如果这里有一个条件不满足的话交换都是不优的。

考虑分类讨论一下:

  • \(a=c,b=d\),那么显然交换会使得我们的答案 \(-1\)
  • \(a=c\) 或者 \(b=d\),那么交换是不劣的。
  • \(a\ne c,b\ne d\),显然不会交换。

考虑操作 \(1\) 是更优的,直接全部搞操作 \(1\)?错,我赛时就是这样,无法获得好看的分数。

因为我们发现难道操作 \(2\) 真的一点用都没有吗?

考虑我的那个样例:

1 2 1 3 2 3

用操作 \(2\) 之后可以变成:

1 1 2 3 2 3

然后后面的那个可以直接用操作 \(1\) 使得答案少 \(1\)

当时也在考场上推出一个更大的例子(虽然推出来这个是少 \(1\),但是忽视了操作 \(2\) 的存在,就相当于是找规律找到的):

1 2 1 3 2 4 3 5 4 6 5 6

过程如下:

(1 1 2 3) 2 4 3 5 4 6 5 6
1 1 (2 2 3 4) 3 5 4 6 5 6
1 1 2 2 (3 3 4 5) 4 6 5 6
1 1 2 2 3 3 (4 4 5 6) 5 6
1 1 2 2 3 3 4 4 5 5 6 6最后一步是直接使用操作1

也就是说我们贪心地先用操作 \(2\),因为这样可以创造出更多的操作 \(1\),而且记得跳过这些处理过的区间,因为这是不交的。

代码2

时间复杂度 \(\mathcal{O}(n)\)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#define int long long
#define N 200005
using namespace std;
int n,a[N];
signed main(){int T;cin >> T;for (;T--;) {scanf("%lld",&n);for (int i = 1;i <= n;i ++) scanf("%lld",&a[i]);int ans = 0;for (int i = 1;i <= n;i ++) ans += (a[i] != a[i - 1]);a[n + 1] = a[n + 2] = a[n + 3] = 0;for (int i = 1;i <= n;i ++)if (a[i] == a[i + 2] && a[i] != a[i + 1]) {//1 2 1int j = i + 1;while(true) {if (a[j] == a[j + 2]) break;if (a[j] != a[j + 3]) break;if (a[j + 1] == a[j + 2]) break;//赛时没有想到j += 2;}if (a[j] == a[j + 2]) ans --,i = j + 1;}printf("%lld\n",ans);}return 0;
}

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

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

相关文章

20251118 正睿

25noip赠送赛day2之不住全季 B \(y\) 没用,将 \(x, y\) 都除以 \(y\) 即可将 \(y\) 变成 \(1\)。 对于两个人 \(i, j\) 来说,只有当 \(x = \frac{b_i - b_j}{a_j - a_i}\) 时他们的顺序才能调换,否则就是确定的。转…

13. Spring AI 的观测性 - Rainbow

13. Spring AI 的观测性 @目录13. Spring AI 的观测性观测性为什么Spring AI应用急需可观测性?AI服务成本失控的痛点Spring AI可观测性的价值实战演练:构建可观测的Spring AI翻译应用第一步:Spring AI项目初始化第二…

Elasticsearch8.4.1升级Elasticsearch9.1.5 - 实践

Elasticsearch8.4.1升级Elasticsearch9.1.5 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

为什么大型炼钢厂(宝武、鞍钢、首钢等)都离不开时序数据库?

钢铁生产是典型的连续化工业流程 —— 从高炉炼铁的原料投入,到转炉炼钢的温度调控,再到轧钢环节的精度控制,每个工序都需依托实时数据调整操作。宝武、鞍钢、首钢等大型炼钢厂,由于生产规模大、设备数量多、工艺链…

20251120周四日记

20251120周四日记今日: 1.早上从家吃了昨天剩的山上下回学校,回来做ppt,拿钥匙。 2.中午和亮吃了饺子,回去继续做ppt,三点做完交了,开始复习DIP。期间跟牢祥聊了个想法:可以把炉石卡图做成3d显示。 3.交完ppt开…

关于 KivyMD 2.x

截至现在,KivyMD已经更新至2.3.1。然而,官方的文档仅仅更新到了1.1.1. 在此期间,KivyMD已经支持了Material Design 3 (MD Me),其控件的调用方式也有所改变。截至目前,就调用按钮来说,KivyMD v2的API如下:与官方之…

工具成瘾——黑客为何痴迷工具与AI(及如何开始用脑思考)

本文探讨黑客过度依赖自动化工具和AI的现象,指出工具外化思考的危害,提供从观察、挑战到反思的完整方法论,包含具体检查清单和90秒思考训练,帮助安全研究人员重拾独立思考能力。大多数人把工具当作宗教:神圣的清单…

完整教程:Flask入门教程——李辉 第5章: 数据库 关键知识梳理

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

vscode修改terminal为conda环境

ctrl+,进入设置,搜索default terminal 然后设置为command prompt

python:crawl4ai安装

一,项目 地址: https://github.com/unclecode/crawl4ai二,通过pip安装: $ mkdir crawl4ai $ cd crawl4ai/ $ python3 -m venv venv $ source venv/bin/activate (venv) liuhongdi@liuhongdi-pc:/data/python/crawl…

洛谷 P4458

P4458标签 线段树因为查询给定的是路径长度的范围,所以对于每个长度都要维护答案。 将修改操作改为 \([1, v]\) 加 \(d\),考虑对长度为 \(len\) 的贡献(算出与长度为 \(len\) 的与 \([1, r]\) 的交集之和即可)。分…

http1.1流水线传输方式

目录核心概念:什么是流水线?流水线的关键特性和要求流水线的巨大缺陷与实践中的弃用现代替代方案:HTTP/2 的多路复用总结这是一个非常重要但又经常被误解的概念,因为它在实践中很少被使用,但理解它能帮助我们更好…

SLB及健康检查

背景: 横向扩容:水平扩容,用更多的节点来支撑更大量的请求,如:增加服务器个数纵向扩容:垂直扩容,扩展一个点的能力来支撑更大的请求,如:升级cpu和内存等 传统反向代理nginx,保活机制keepalive云产品SLB负载均…

2025贝赛思考试培训哪家专业?5大优质机构测评,覆盖全阶段备考需求

2025贝赛思考试培训哪家专业?5大优质机构测评,覆盖全阶段备考需求随着留学低龄化趋势加剧,贝赛思国际学校因优质的国际化教育资源,成为众多家庭的首选目标,其入学考试的竞争性也逐年提升。专业的贝赛思考试培训机…

2025牛客国庆集训派对day7 M C 个人题解 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

C++ 中 struct 与 class 的用法与区别

C++ 中 struct 与 class 的用法与区别Posted on 2025-11-20 22:06 steve.z 阅读(0) 评论(0) 收藏 举报C++ 中 struct 与 class 的用法与区别 1. 概述 在 C++ 中,struct 与 class 都可以用来定义用户自定义类型(…

网关上的限流器

1. nginx原生限流能力 https://blog.nginx.org/blog/rate-limiting-nginx ngx_http_limit_req_module 提供的请求限流能力必须基于某个预定义的key,eg: client Ip, request_uri, host_name, 这个限流器是基于漏桶算法。…

PyTorch 分布式训练底层原理与 DDP 实战指南

深度学习模型参数量和训练数据集的爆炸式增长,以 Llama 3.1 为例:4050 亿参数、15.6 万亿 token 的训练量,如果仅靠单 GPU可能需要数百年才能跑完,或者根本无法加载模型。 并行计算(Parallelism)通过将训练任务分…

2025年11月SAT辅导哪家强?机考适配/名师授课/定制方案的机构推荐

2025年11月SAT辅导哪家强?机考适配/名师授课/定制方案的机构推荐随着留学申请竞争的加剧,SAT成绩作为海外名校录取的核心参考指标,其重要性愈发凸显。专业的SAT辅导机构不仅能帮助学员精准定位知识薄弱点,更能通过…