Gokix

一言(ヒトコト)

关注我

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

简要题意

给定序列 \(\{a_n\},\{b_n\}\),求一个序列 \(\{c_n\}\) 满足 \(\forall i\in[1,n],c_i\in\{a_i,b_i\}\),求最大

\[\max\{r-l+1-\operatorname{mex}\{c_l,c_{l+1},\dots, c_{r-1},c_r\}\}(1\le l\le r\le n) \]

\(1 \leq n\le 10^6\)\(0\leq a_i,b_i\leq n\)

Sol

我们把 \(a_i=b_i\)\(i\) 叫做间断点,\(a_i \ne b_i\)\(i\) 叫做摇摆点。

\(\operatorname{mex}\) 这种东西没有特别好的转化方法,于是很自然地想到枚举 \(\operatorname{mex}\)

假设现在枚举到的 \(\operatorname{mex}\)\(u\)。则整个序列被 \(a_i=u\) 的间断点(假设有 \(m\) 个这样的间断点)分成 \(m+1\) 段(两端也要算,参见题面中的小样例),每段中间部分(不含端点)的 \(\operatorname{mex}\) 不大于 \(u\)。但是因为如果其 \(\operatorname{mex}\) 真的比 \(u\) 小,那么我们在枚举对应的 \(\operatorname{mex}\) 时已经处理过了,所以我们不妨就认定这一部分的 \(\operatorname{mex}\) 就是 \(u\)

显然,我们肯定去取相邻间断点之间的部分。因为在 \(\operatorname{mex}\) 确定的情况下我们希望区间长尽可能短。(当然你跨着间断点取 \(\operatorname{mex}\) 也不保证不大于 \(u\) 了)

接下来考虑摇摆点的影响。

没有影响。

嗯嗯,是的。因为你总可以让摇摆点取一个不是 \(u\) 的值,从而使得这一段数的 \(\operatorname{mex}\le u\),所以摇摆点没有影响

剩下的问题就是如何去把权值相同的间断点整一块。方法就是按权值建数表,不断把对应权值的间断点的下标插入对应的权值点。

code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long rd(){char ch=getchar();long long x=0,f=1;while(ch<'0' || ch>'9'){if(ch=='-') f=-1;ch=getchar();}
                        while('0'<=ch && ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;}
void wr(long long x){if(x<0){putchar('-');x=-x;}if(x>9) wr(x/10);putchar(x%10+'0');}

const long long N=1e6+10;
long long n,a[N+10],b[N+10],p[N+10],h[N+10],tot,ans=-1;
struct edge{long long v,nxt;}e[2*N+10];
void add(long long u,long long v){e[++tot].v=v;e[tot].nxt=h[u];h[u]=tot;}

int main(){
	long long i,j,u,v;
	n=rd();
	for(i=1;i<=n;i++){a[i]=rd();}
	for(i=1;i<=n;i++){b[i]=rd();}
	for(i=n;i>=1;i--){
		if(a[i]>b[i]) swap(a[i],b[i]);
		else if(a[i]==b[i]){
			p[i]=1;
			add(a[i],i);
		}
	}
	long long l,r;
	for(u=0;u<=n+1;u++){
		l=1;
		if(h[u]==0){
			ans=max(ans,n-u);
			continue;
		}
		for(i=h[u];i;i=e[i].nxt){
			v=e[i].v;
			ans=max(ans,v-1-l+1-u);
			l=v;
		}
		ans=max(ans,n-l-u);
	}
	wr(ans),putchar('\n');
	return 0;
}
posted @ 2022-07-24 22:55  Gokix  阅读(56)  评论(0编辑  收藏  举报