http://codeforces.com/problemset/problem/591/C
这道题的原意是对一个数组进行中值滤波,也就是让一个数等于自己,左边右边的中位数。问什么时候数组不再发生变化。
首先,如果一个数组不发生变化,我们很容易想到这样的数组中每个数至少和左边或者右边相等。那么只有01交替的数组才会发生变化。
那么我们写几个数组在实验一下
010101 —-> 000111 使用了2次
0101 —-> 0011 使用了一次
01010 —–> 00000 使用了2次
使用的次数 = 除首位外的长度/2,最后的数组左半边和右办边分别和做右端点相等
之后只要维护出最大的次数就行
#include <bits/stdc++.h>
using namespace std;
int a[500005];
int main()
{
int n;
cin>>n;
for(int i = 1;i<=n;i++)
{
cin>>a[i];
}
int last = 1,ans = 0,l,r;
for(int i = 2;i<=n+1;i++)
{
if(a[i] == a[i-1] || i == n+1)
{
ans = max(ans,(i - 1-last)/2);
r = i - 2;
l = last +1;
while(l <= r)
{
a[l++] = a[last];
a[r--] = a[i-1];
}
last = i;
}
}
cout<<ans<<endl;
for(int i =1;i<=n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}