P3411 序列变换 题解
自己做不出来,看现在题解区的题解讲的都不咋清楚。懂了之后来为后人铺路。而且我的马蜂比较好看
我能看懂这道题,主要是依靠了这篇题解的帮助。
首先我们只关注数的相对关系,所以可以离散化。注意到值域
这道题可以用贪心做。(有一些定义先往下看)
定义一个无缝子序列:一个子序列中最小值为
例如原序列离散化后是 1 4 4 2 3 7 5 4 5 6
,那么子序列 5 5 6
是无缝的;子序列 4 4 4 6
不是无缝的,因为 4 4 5 4 5 6
也不是无缝的,因为不单调不减。
再定义一个无缝子序列的拓展长度:假设一个无缝子序列的最小值为
现在抛出贪心的结论:答案就是
为什么呢?首先我们证明存在一组解,可以构造出
假设无缝子序列
那就可以固定
剩下所有数,分成两拨:小于
将小于
这样每个没固定的数都使用了一次操作,共
下面证明不存在比
那么说明至少有
综上所述,最终的答案就是
那具体怎么求呢?对每个位置求出
一个无缝子序列的充要条件是:对于任意
发现如果
那么可以从小到大遍历每种数值,如果当前数值不能再扩张了,就把之前记录下的所有数值共同构成一个无缝子序列,计算其拓展长度并更新最大值。
注意最后输出
最后看在题解写的这么详细的份上,给个关注呗
喜闻乐见的代码:
#include <bits/stdc++.h>
using namespace std;
int n;
int a[1000005];
int b[1000005];
int l[1000005], r[1000005];
int cnt[1000005] = {};
int pos[1000005] = {}, pre[1000005], nxt[1000005] = {};
int cal(int mn, int mx) { //计算最小值为mn最大值为mx 的无缝子序列拓展长度
int res = 0;
for (int i = mn; i <= mx; i++) //先加上子序列内的数个数
res += cnt[i];
for (int i = l[mn - 1]; i && i < l[mn]; i = nxt[i]) //在mn左边的mn-1个数
res++;
for (int i = r[mx + 1]; i > r[mx]; i = pre[i]) //在mx右边的mx+1个数
res++;
return res;
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
b[a[i]] = 1;
}
for (int i = 1; i <= 1000000; i++)
b[i] += b[i - 1];
for (int i = 1; i <= n; i++)
a[i] = b[a[i]]; //离散化
for (int i = 1; i <= n; i++)
if (l[a[i]] == 0)
l[a[i]] = i;
for (int i = n; i >= 1; i--)
if (r[a[i]] == 0)
r[a[i]] = i;
for (int i = 1; i <= n; i++) {
pre[i] = pos[a[i]];
pos[a[i]] = i;
}
memset(pos, 0, sizeof pos);
for (int i = n; i >= 1; i--) {
nxt[i] = pos[a[i]];
pos[a[i]] = i;
} //求辅助数组们
int UL = 0;
for (int i = 1; i <= n; i++) {
UL = max(UL, a[i]); //求最大值好遍历
cnt[a[i]]++;
}
int lst = 1;
int ans = 0;
for (int i = 2; i <= UL + 1; i++)
if (r[i - 1] > l[i] || i == UL + 1) {
ans = max(ans, cal(lst, i - 1));
lst = i;
}
printf("%d", n - ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!