1 条题解
-
0
自动搬运
来自洛谷,原作者为

Christmas_Defunct
垃圾中考搬运于
2025-08-24 23:07:21,当前版本为作者最后更新于2024-12-21 19:58:19,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
很简单的分类讨论题,赛时 AC 了。
题意简化
你可以对序列 进行如下两类操作 次。
- 交换 和 ,其中 。
- 删除 ,但是必须满足 。
显然的,有 种方法可以使 为空串,现在想知道所有方法中 的大小。
解法
这题求 的做法很显然:使操作 的效率最大化,因为只有操作 可以删除数,而操作 却无法删除。
这时候问题聚焦于另一个地方:如何使操作 的效率最大化呢?
注意到 ,所以可以猜测做法为通过操作 构造满足 的序列,这样的话就可以满足仅需修改首尾便可满足操作的 条件。
这里,我们只需要分析 和 。
- 若 ,进行 次操作 即可,。
- 若 ,继续分类讨论。
记 为 在序列中出现的次数。
- 若 ,记另外任意一个值为 且在 中出现的数的位置为 ,进行一次操作 ,交换 ,随即转换为 ,故 。
- 若 ,记另外任意一个值为 且在 中出现的数的位置为 ,进行一次操作 ,交换 ,随即转换为 ,故 。
- 若不满足 和 但是 ,此时记 和 为其中相异的两个值为 的数的下标,进行 次操作 ,分别交换 和 ,随即转换为 ,故 。
- 若 ,则无论如何进行多少次操作 都无法转化为 ,此时只能使 ,必定满足 ,有 个数,所以此时 。
这样,我们便完成了分类讨论,下面进行整理。
整理得
- 若 ,;
- 若 或 ,;
- 若 ,则 ;
- 否则 。
这里的 又被称之为桶数组,用了空间换时间的优化方法。用 的空间换掉了 的时间。此时空间复杂度为 ,时间复杂度为 。时间上可以通过 的数据,但是无法满足 。
注意到 的数量最多为 个,所以用离散化可以去掉多占用的空间,将空间复杂度优化至 ,此处仅使用
map进行优化即可,此处不再赘述map的使用方法,不会用的可以参考别的文章。综上,我们的每个过程复杂度变化如下:
- 时间复杂度:。
- 空间复杂度:$\mathcal{O}(n)\to\mathcal{O(\max a)}\to\mathcal{O}(n)$。
代码
下面是本题的代码,请勿抄袭,
这么简单的题目咱还是别抄了。#include <bits/stdc++.h> using namespace std; void work() { int n, a[100005]; bool flag = false; cin >> n; map<int, int> mp; memset(a, 0, sizeof a); for (int i = 1; i <= n; i++) { cin >> a[i]; mp[a[i]]++; if (mp[a[i]] == 2) flag = true; } if (mp[a[1]] >= 2 || mp[a[n]] >= 2) { if (a[1] == a[n]) cout << 1 << '\n'; else cout << 2 << '\n'; } else if (mp[a[1]] == 1 && mp[a[n]] == 1) { if (flag) cout << 3 << '\n'; else cout << n << '\n'; } } signed main() { int t; cin >> t; while (t--) work(); return 0; }此文是本人的第 篇题解,欢迎参考!
- 1
信息
- ID
- 10951
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 2
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者