CF590A Median Smoothing

CF590A Median Smoothing

洛谷传送门

题意翻译

题目描述

最简单的中值滤波是对一个序列 a_1,a_2,…,a_na1,a2,…,a**n ,转换为一个新的序列 b_1,b_2,…,b_nb1,b2,…,b**n ,规则如下:

  • b_1=a_1,b_n=a_nb1=a1,b**n=a**n ,即第一个和最后一个元素不变。
  • b_i(1<i<n)b**i(1<i<n) 为 a_{i-1},a_i,a_{i+1}a**i−1,a**i,a**i+1 的中位数。

求对于一个序列 aa ,它经过几次操作会变成“稳定的”,或者永远稳定不了。

输入格式

第一行一个整数 nn ,表示序列的长度。

接下来一行 nn 个整数 a_1,a_2,…,a_na1,a2,…,a**n ,表示原序列。

输出格式

假如该序列永远也不会稳定,则输出 -1−1 。

否则输出,一行一个整数,表示需要多少次操作原序列才会稳定,并在下一行输出最终稳定的序列。

说明

样例解释

经过两次操作:01010\longrightarrow00100\longrightarrow0000001010⟶00100⟶00000 ,0000000000 显然是稳定的序列。

对于 2525% 的数据,n<=10n<=10 。

对于 5050% 的数据,n<=1000n<=1000 。

对于 2525% 的数据,n<=500000n<=500000 。


题解:

规律题:

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+5;
int n,tmp,Ans;
bool a[maxn],ans[maxn];
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&tmp);
		ans[i]=a[i]=!tmp?0:1;
	}
	for(int i=2;i<=n;i++)
		if(a[i]^a[i-1])
		{
			int len=1,bg=i-1;
			while(a[i]^a[i-1]&&i<=n)
				len++,i++;
			i--;
			if(len&1)
			{
				for(int j=bg;j<=i;j++)
					ans[j]=a[bg];
				Ans=max(Ans,len/2);
			}
			else
			{
				for(int j=bg;j<=(bg+i)/2;j++)
					ans[j]=a[bg];
				for(int j=(bg+i)/2+1;j<=i;j++)
					ans[j]=a[i];
				Ans=max(Ans,len/2-1);
			}
		}
	printf("%d\n",Ans);
	for(int i=1;i<=n;i++)
		printf("%d ",ans[i]?1:0); 
	return 0;
}
posted @ 2020-12-01 16:10  Seaway-Fu  阅读(89)  评论(0编辑  收藏  举报