2020.7.27T1中位数(jz暑假训练day11)

Description

在这里插入图片描述

Input

在这里插入图片描述

Output

在这里插入图片描述

Sample Input

5
0 1 0 1 0

Sample Output

2
0 0 0 0 0

Data Constraint

在这里插入图片描述

赛时

直接枚举,预测应该能混个4,50吧?结果80分

正解

我们可以考虑怎么求出每个位置的变化次数.
不难发现, 如果 ai−1 和 ai+1 中有至少一个和 ai 相同, 那么 ai 就不会变.
因此, 会变的只能是 01010101 · · · 或者 10101010 · · · 这样的连续段. 而这样的连续段的变化规
律是每次连续段两端的长度减少 1.

#include<cstdio>
#include<iostream>
#define N 500007
using namespace std;
int n,a[N],ans,b[N],lw,rw,l,r,num;
int main(){
	freopen("median.in","r",stdin);
	freopen("median.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	a[0]=a[1],a[n+1]=a[n];
	for(int i=1;i<=n;i++){
		if(a[i]==a[i-1]||a[i]==a[i+1]){
			b[i]=a[i];
			if(l){
				rw=a[i];r=i-1;
				if(lw==rw){
					for(int j=l;j<=r;j++) b[j]=lw;
				}else{
					for(int j=l;j<=(l+r)/2;j++)	b[j]=lw;
					for(int j=(l+r)/2+1;j<=r;j++) b[j]=rw;
				}
				ans=max(ans,(num+1)/2);
				lw=0,rw=0,l=0,r=0,num=0;
			}
		}
		else{
			if(!l) lw=a[i-1],l=i;
			num++;
		}
	}
	printf("%d\n",ans);
	for(int i=1;i<=n;i++)
		printf("%d ",b[i]);
}

猜你喜欢

转载自blog.csdn.net/jay_zai/article/details/107618609