题目链接:点击打开链接
题目要求不断使用median smooth对数组进行处理
而0 1数组稳定时一定成分块状,且只需对类似于‘ 0 1 0 1 ...‘这样存在两对及以上交错子序列进行处理即可
当末尾与第一个相同时需操作 length/2 次
而当末尾与第一个不同时需操作 length/2 - 1 次
所以需要遍历一遍该序列然后取其最大值即可
AC代码如下:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define REP(i,a,b) for(i=a;i<=b;++i)
int n, cnt;
int num[500005];
void solve()
{
cnt = 0;
int temp_length = 0;
for(int i=1;i<n;++i)
{
int be = -1;
if(num[i]!=num[i+1])
{
be = i, temp_length=2;
while(num[i]!=num[i+1]&&i<n)
{
i++;
temp_length++;
}
i--, temp_length--;
if(temp_length<=2) continue;
cnt = max(temp_length-1+be==n||num[i+1]==num[i+2]?(temp_length-1)/2:temp_length/2,cnt);
if(num[be+temp_length-1]==num[be]) fill(num+be,num+temp_length+be,num[be]);
else
{
// int i;
/*REP(i,be,temp_length/2+be-1) num[i]=num[be];
REP(i,temp_length/2+be,temp_length+be) num[i]=num[temp_length+be-1];*/
fill(num+be,num+temp_length/2+be,num[be]);
fill(num+temp_length/2+be,num+temp_length+be,num[temp_length+be-1]);
}
}
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
while(cin>>n)
{
memset(num,-1,sizeof(num));
for(int i=1;i<=n;++i)
cin>>num[i];
solve();
cout<<cnt<<endl;
for(int i=1;i<=n;++i)
cout<<num[i]<<" ";
cout<<endl;
}
return 0;
}