P8445 射命丸文的取材之旅

题目背景

射命丸文(Syameimaru Aya)是一只鸦天狗。她不定期制作名为「文文。新闻」的报纸,而为此,她需要对她收集到的新闻进行剪裁。

题目描述

射命丸文现在收集到了 2n2n2n 条新闻。她想要将其刊登于自己的报刊之上。然而,自己的报刊最多只能刊登 nnn 条新闻。

为了能在 nnn 条新闻的篇幅中让自己的报刊得到最大的吸引力,她将这 2n2n2n 条新闻等分两份,即每一份中均有 nnn 条新闻。

每一条新闻自然有着其吸引力。在第一份中,第 iii 条新闻有着吸引力 aia_iai,而在第二份中,第 iii 条新闻有着吸引力 bib_ibi。这两份新闻的划分在输入时已经给定。

现在射命丸文要从中选取新闻放入自己的报刊。报刊上的第 iii 条新闻,将选择第一份新闻的第 iii 条或第二份新闻的第 iii 条。这样,报刊上的新闻就可以构成一个长度为 nnn 的序列,第 iii 项也就是第 iii 条新闻有着吸引力 ci∈{ai,bi}c_i \in \{a_i,b_i\}ci{ai,bi}

而这样的一份报刊有着其综合影响力。根据射命丸文的经验,对于她这样的一份含有 nnn 条新闻的报刊,其综合影响力为:

max⁡{r−l+1−mex⁡{cl,cl+1,…,cr−1,cr}}(1≤l≤r≤n)\max\{r-l+1-\operatorname{mex}\{c_l,c_{l+1},\dots, c_{r-1},c_r\}\}(1\le l\le r\le n)max{rl+1mex{cl,cl+1,,cr1,cr}}(1lrn)

其中 mex⁡{cl,cl+1,…,cr−1,cr}\operatorname{mex}\{c_l,c_{l+1},\dots,c_{r-1},c_r\}mex{cl,cl+1,,cr1,cr} 指的是 cl,cl+1,…,cr−1,crc_l,c_{l+1},\dots,c_{r-1},c_rcl,cl+1,,cr1,cr 中没有出现过的最小非负整数

现在她希望知道,在进行这些操作之后,自己的报刊的最大的综合影响力会是多少呢?由于她还要继续取材,因此她把这个任务交付给了你。

【形式化题意】

给定序列 {an},{bn}\{a_n\},\{b_n\}{an},{bn},求一个序列 {cn}\{c_n\}{cn} 满足 ∀i∈[1,n],ci∈{ai,bi}\forall i\in[1,n],c_i\in\{a_i,b_i\}i[1,n],ci{ai,bi},最大化

max⁡{r−l+1−mex⁡{cl,cl+1,…,cr−1,cr}}(1≤l≤r≤n)\max\{r-l+1-\operatorname{mex}\{c_l,c_{l+1},\dots, c_{r-1},c_r\}\}(1\le l\le r\le n)max{rl+1mex{cl,cl+1,,cr1,cr}}(1lrn)

并输出该式子可能的最大值。

输入格式

第一行一个正整数 nnn,表示每一份新闻中的新闻条数。

第二行 nnn非负整数表示第一份新闻中每一条新闻的吸引力,即 a1,a2…,an−1,ana_1,a_2\dots ,a_{n-1},a_na1,a2,an1,an

第三行 nnn非负整数表示第二份新闻中每一条新闻的吸引力,即 b1,b2…,bn−1,bnb_1,b_2\dots ,b_{n-1},b_nb1,b2,bn1,bn

输出格式

输出一个整数,表示报刊的最大的综合影响力会是多少。

输入输出样例 #1

输入 #1

5
0 1 0 1 2
0 2 0 1 0

输出 #1

3

说明/提示

【样例解释和说明】

射命丸文可以让自己的 555 条新闻分别取第二份的第 111 条,第一份的第 222 条,第一份的第 333 条,第一份的第 444 条和第二份的第 555 条。这样一来,她的报刊每条新闻的吸引力 cic_ici 分别为 0,1,0,1,00,1,0,1,00,1,0,1,0。令 l=1,r=5l=1,r=5l=1,r=5,则 mex⁡{c1,c2,c3,c4,c5}=2\operatorname{mex}\{c_1,c_2,c_3,c_4,c_5\}=2mex{c1,c2,c3,c4,c5}=2r−l+1−mex⁡{c1,c2,c3,c4,c5}=3r-l+1-\operatorname{mex}\{c_1,c_2,c_3,c_4,c_5\}=3rl+1mex{c1,c2,c3,c4,c5}=3,不难证明其为数列 ccc 的综合影响力,也是所有的可能的 ccc 的最大综合影响力。

【数据范围】

对于 20%20\%20% 的数据,满足 1≤n≤101 \leq n\leq 101n10

另外 40%40\%40% 的数据满足 ai=bia_i=b_iai=bi

对于 100%100\%100% 的数据,满足 1≤n≤1061 \leq n\le 10^61n1060≤ai,bi≤n0 \leq a_i,b_i\leq n0ai,bin

C++实现

#include<bits/stdc++.h>
#define N 1000005
#define ll long long
using namespace std;

int n,a[N],ans=-1e9;
vector<int> pos[N];

inline int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}

int main(){
	n=read();
	for(int i=1;i<=n;i++)a[i]=read();
	for(int i=1,b;i<=n;i++){
		b=read();
		if(b==a[i])pos[b].push_back(i); //记录x=b时的屏障的位置
	}
	for(int i=0;i<=n;i++){
		pos[i].push_back(n+1); //对所有的x在区间末尾加一个屏障,方便计算
		for(int j=0,before=1;j<pos[i].size();j++){
			ans=max(ans,pos[i][j]-before-i);
			before=pos[i][j]+1;
		}
	}
	cout<<ans;
	return 0;
}


在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

更多推荐