P12008 【MX-X10-T4】[LSOT-4] Fragment of Memories 题解

news/2025/4/3 0:08:03/文章来源:https://www.cnblogs.com/YhjOI/p/18804660

一. 题面:点这里

二. 思路:

首先需要感谢 良心WA题人 巨佬提供的复杂度证明思路,好人一生平安。

首先考虑答案的性质,发现答案具备单调性,所以考虑二分答案 \(m\) 。然后对于朴素的 check 你可以做到每一次都是 \(O(n)\) 的。然后枚举每一个记忆的起始数字,总复杂度 \(O(n^2\log n)\)

考虑优化,显然枚举每一个记忆起始数字这个部分是每一次的答案贡献,我们很难优化,那么考虑 check 的部分,思考具体的过程。每一次 check 我们都是扫一遍,遇到最近的 \(x+1\) 就作为最后答案序列的一部分,这个贪心的正确性是显然的。然后你发现这就形成了一个跳跃的过程,那么我们考虑是否可以预处理维护。然后就发现这个其实是可以线性维护预处理的(细节看代码)。但是如果连续段很稠密,你发现复杂度还是会退化成朴素做法,但是因为形成了跳跃的过程,有经验的选手就会发现这显然是可以倍增的,所以搞一个倍增数组 \(f_{i,j}\) ,意义不再阐述,而 \(f_{i,0}\) 就是我们刚才预处理的东西。那么你发现我们现在就可以在 \(O(\log n)\) 的复杂度下去处理上述贪心了。所以一次 check 的复杂度就变成了 \(O(k\log n)\) 。具体的,你可以枚举每个起始值 \(x\) 的位置,然后暴力往后跳。你发现枚举起始值 \(x\) 的过程是均摊线性的。所以总时间复杂度由 枚举+二分+check 三部分组成,最终总时间复杂度为:\(O(n\log^2n)\)

到目前为止,我们已经可以拿到 82pts 了,但是还可以更加优化。注意到一个性质,若起始值为 \(x\) 的答案记作 \(ans\) ,那么起始值为 \(x+1\) 的答案至少为 \(\max\{0,ans-1\}\) ,所以我们考虑维护一个双指针,左端点为 \(x\) ,右端点为 \(x+ans-1\) 。然后再去利用上述的 check 去做,这样的话就省去了二分的过程,效率会更优化,但是我们希望可以量化这个复杂度(再次感谢巨佬 良心WA题人)。和第一次的优化相仿的,我们不妨采取均摊复杂度分析。考虑双指针维护的某一个区间 \([l,r]\) ,我们记他们分别在原序列中的 \(cnt\) 有一个比较显然的性质就是区间 \([l,r]\) 的出现次数一定不会超过 \(\min\{cnt_l,cnt_r\}\) 然后你发现双指针的本质就是我们按照区间 \([l,r]\) 的出现次数扫那么也是均摊线性的,所以本质上我们就去掉了二分答案中的那一层 \(\log\)

在最终实现上还有对代码运行速度的优化,所以建议读者阅读本人的代码以作参考。

三. Code:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<vector>
inline int read() {int x=0,f=1;char ch=getchar();while(ch > '9' || ch < '0'){if(ch == '-'){f = -1;}ch = getchar();}while(ch >= '0'&&ch <= '9'){x = x * 10 + ch - 48; ch = getchar();}return x * f;
}void write(int x) {if (x > 9) {write(x / 10);}putchar(x % 10 + 48);
}const int N = 2e6 + 10,LOGN = 24;
std::vector<int> pos[N];
int n,k,V,f[N][LOGN],tmp[N],a[N],Log[N];int retn_pos(int id,int v)
{if(id > n && v > V) return n + 1;return *std::upper_bound(pos[v].begin(),pos[v].end(),id);
}int lowbit(int x){return x & (-x);}
bool check(int num,int m)
{--m;int ps = 0;int tp[21];ps = retn_pos(ps,num);int cnt = 0,j;while(m){j = lowbit(m);m -= j;j = Log[j];ps = f[ps][j];tp[++cnt] = j;if(ps == n + 1) return false;}if(ps == n + 1) return false;for(int i = 1;i <= k - 1;++i){ps = retn_pos(ps,num);for(int j = 1;j <= cnt;++j){ps = f[ps][tp[j]];if(ps == n + 1) return false;}if(ps == n + 1) return false;}return true;
}int main()
{n = read(),k = read(),V = read();for(int i = 2;i <= n;++i) Log[i] = Log[i >> 1] + 1;for(int i = 1;i <= n;++i){a[i] = read();pos[a[i]].push_back(i);}for(int i = 1;i <= V;++i) pos[i].push_back(n + 1);for(int i = n;i >= 1;--i){if(!tmp[a[i] + 1]) f[i][0] = n + 1;else f[i][0] = tmp[a[i] + 1];tmp[a[i]] = i;}f[n + 1][0] = n + 1;for(int j = 1;j <= 20;++j)for(int i = 1;i <= n + 1;++i)f[i][j] = f[f[i][j - 1]][j - 1];int ans = 0;for(int i = 1;i <= V;++i){ans = std::max(0,ans - 1);while(check(i,ans + 1)) ++ans;write(ans);putchar(32);}return 0;
}

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

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

相关文章

GSoC谷歌编程之夏2025招募中,Apache DolphinScheduler需要你的提案!

GSoC谷歌编程之夏活动火热进行中!今年,Apache DolphinScheduler项目也依然参与其中,设立了有趣且有挑战性的项目任务,与通用OIDC认证有关。欢迎有才华的你们来挑战! GSoC的起源与目的 GSoC 即 Google Summer of Code(谷歌编程之夏),是谷歌公司发起的一项全球性活动,旨…

D365 邮箱发送,自动追加 CRM:0000001的问题处理

需要改下这个配置,去掉邮件标题 后面带的 CRM:0000001 记得收藏并关注,掌握更多相关知识!!!

4.1 函数

1.1 定义域 A,记作dom f=A; 值域记作:ran f1.2 函数的特点 A到B的函数是从A到B的二元函数的子集,且A中的每一个元素a都必须是f的有序对(a,b)的第一分量,通常把(x,y)∈f,记作f(x)=y,f把x映射成了y *定义域必须在第一分量里都出现 函数个数:nm,不同关系的个数2mn1.3 常…

一句话胜千言系列:BatchNorm和LayerNorm

1. 前言 一方面便于日后自己的温故学习,另一方面也便于大家的学习和交流。 如有不对之处,欢迎评论区指出错误,你我共同进步学习! 2. 正文 区别就一句话:BatchNorm是对一个batch-size样本内的每个特征[分别]做归一化,LayerNorm是[分别]对每个样本的所有特征做归一化。3. 后…

复现论文

以原始LoRA论文为例 目录在本地复现 在本地复现 首先创建虚拟环境。虚拟环境之间,以及虚拟环境与全局环境之间是相互隔离的,所以我们在虚拟环境中安装包并不会影响到其他的环境打开Anaconda Prompt,输入conda create -n test python=3.12.9创建一个名为test,Python解释器版…

需求分析(第五组)

一、项目背景 随着我国《"十四五" 残疾人保障和发展规划》的深入推进,信息无障碍建设成为社会关注的焦点。根据中国残联统计数据,我国现有视障人士 1700 万,其中高校在读视障学生数量逐年递增。当前视障群体在校园场景中面临三大核心痛点:动态障碍物检测缺失(如…

20242816 2024-2025-2 《网络攻防实践》第5次作业

20242816 2024-2025-2 《网络攻防实践》第5次作业 1 实践内容 一、防火墙配置 任务要求:配置Linux操作系统平台上的iptables,或者Windows操作系统平台上的个人防火墙,完成如下功能,并进行测试: (1)过滤ICMP数据包,使得主机不接收Ping包; (2)只允许特定IP地址,访问主机的某一…

Higress 开源 Remote MCP Server 托管方案,并将上线 MCP 市场

导读:MCP Server 的实施存在着诸多挑战,特别是在认证授权、服务可靠性和可观测性方面,Higress 作为 AI 原生的 API 网关,提供了完整的开源 MCP Server 托管解决方案,实现存量 API 到 MCP 的协议转换。即将上线的 MCP 市场,将大幅降低开发者构建 MCP Server 的时间和人力成…

智慧排水管网信息系统:数字化赋能城市治水新格局

2025年3月,一场暴雨突袭某城市主干道。但这一次,市政人员仅用10分钟便锁定了积水点,调度泵站精准排水,避免了交通瘫痪。这背后,正是智慧排水管网信息系统的“超能力”在发挥作用。这一系统如何重塑城市排水管理?本文将深度解析其建设框架与技术内核。 一、为什么需要智慧…

在Ubutnu22.04 显卡3090上安装cuda12.4

一、 检查驱动状态 nvidia-smi 如果没有以下输出就要安装一下驱动 在ubutnu22.04中安装3090使用以下命令sudo apt update && sudo apt upgrade && sudo apt install gcc makesudo apt install nvidia-driver-550驱动搞定就重启 sudo reboot二、安装cua 12.4 …

基于阿里云可观测产品构建企业级告警体系的通用路径与最佳实践

前言 1.1 日常生活中的告警 任何连续稳定运行的生产系统都离不开有效的监控与报警机制。通过监控,我们可以实时掌握系统和业务的运行状态;而报警则帮助我们及时发现并响应监控指标及业务中的异常情况。在日常生活中,我们也经常遇到各种各样的告警。例如,在驾驶传统机动车时…