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;
}