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