P8445 射命丸文的取材之旅 题解

题意:给定 {an},{bn},求 max1lrn,ci{ai,bi}{rl+1mexi=lrci}

Subtask 1

特殊条件:1n10O(2nn2) 暴力枚举 ci,l,r 取值即可。

Subtask 2

特殊条件:ai=bi。问题转化为给定 {cn},求 max1lrn{rl+1mexi=lrci}

注意到 0cin,考虑枚举 x=mexi=lrci,对每个 x[0,n] 求出满足条件的最大 rl+1

i[l,r],cixx=mexi=lrci 的必要条件,但我们可以升序枚举 x,然后把它当成充分条件来用。

证明:如果有 i[l,r],cixxmexi=lrci,那么一定有 x>mexi=lrci

而更小的 x=mexi=lrci 已经枚举过,且 rl+1x>rl+1xx 不会对答案造成影响。

问题转化为对每个 x[0,n]max1lrn,i[l,r],cixrl+1

考虑正序扫一遍 {cn},记录 pkk 上次出现的位置,sk 为当前 max1lrn,i[l,r],cikrl+1

扫到 ci 时,用 ipci1 更新 scil=pci+1,r=i1),再更新 pcii

k[0,n],pk=0,这样就考虑了 l=1 的情况;扫完后,用 npk 更新 sk,这样就考虑了 r=n 的情况。

以上,我们对每个 x[0,n] 求出了满足 x=mexi=lrci 的最大 rl+1O(n) 枚举 x 即可。

#include <cstdio>
#include <algorithm>
using namespace std;
int n, q, c[1000050], p[1000050], s[1000050];
int main()
{
    scanf("%d", &n);
    for(int i = 1;i <= n;++i) scanf("%d", c + i),
    s[c[i]] = max(s[c[i]], i - p[c[i]] - 1), p[c[i]] = i;
    for(int k = 0;k <= n;++k) s[k] = max(s[k], n - p[k]);
    for(int x = 0;x <= n;++x) q = max(q, s[x] - x);
    return printf("%d", q), 0;
}

Subtask 3

仍然考虑枚举 x=mexi=lrci,对每个 x[0,n] 求出满足条件的最大 rl+1

i[l,r],aixbixx=mexi=lrci 的必要条件,升序枚举 x,可以把它当成充分条件来用。证明同上。

考虑正序扫一遍 {an},{bn},当 ai=bi 时更新 saipai。注意考虑 l=1r=n 的情况。

以上,我们对每个 x[0,n] 求出了满足 x=mexi=lrci 的最大 rl+1O(n) 枚举 x 即可。

#include <cstdio>
#include <algorithm>
using namespace std;
int n, q, a[1000050], b[1000050], p[1000050], s[1000050];
int main()
{
    scanf("%d", &n);
    for(int i = 1;i <= n;++i) scanf("%d", a + i);
    for(int i = 1;i <= n;++i) scanf("%d", b + i);
    for(int i = 1;i <= n;++i) if(a[i] == b[i])
    s[a[i]] = max(s[a[i]], i - p[a[i]] - 1), p[a[i]] = i;
    for(int k = 0;k <= n;++k) s[k] = max(s[k], n - p[k]);
    for(int x = 0;x <= n;++x) q = max(q, s[x] - x);
    return printf("%d", q), 0;
}
posted @   Jijidawang  阅读(6)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示