题意:给出一个01序列a.操作:令b[1]=a[1],b[n]=a[n] b[i]=(a[i-1],a[i],a[i+1])出现最多的数值(0/1).然后令序列a等于序列b.
n<=5e5.问操作多少次,使得操作后过后的序列不会发生变化? 若永远在变化输出-1,否则输出最后的序列.
若当前位置i满足,a[i]==a[i-1]或者a[i]==a[i+1] 则无论操作多少次 a[i]不会发生变化
10101 -> 11011 -> 11111
101010 ->110100 -> 111000
1010101 -> 1101011 -> 1110111 -> 1111111
遍历所有的[.1010101.]段,[.分别和开头结尾相同]
若开头和结尾都为1 则该段区间最后会变为1
若开头结尾不同. 则变为11100的形式
n<=5e5.问操作多少次,使得操作后过后的序列不会发生变化? 若永远在变化输出-1,否则输出最后的序列.
若当前位置i满足,a[i]==a[i-1]或者a[i]==a[i+1] 则无论操作多少次 a[i]不会发生变化
10101 -> 11011 -> 11111
101010 ->110100 -> 111000
1010101 -> 1101011 -> 1110111 -> 1111111
遍历所有的[.1010101.]段,[.分别和开头结尾相同]
若开头和结尾都为1 则该段区间最后会变为1
若开头结尾不同. 则变为11100的形式
并且在该段的改变次数为,op=(该段长度-1)/2 , 则总的操作次数为max(op)
#include <bits/stdc++.h>
using namespace std;
const int N=2e6+5;
int n,a[N],b[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
bool flag=true;
int cnt=0,j;
for(int i=1;i<=n;i=j)
{
j=i;
while(j+1<=n&&a[j]!=a[j+1])
j++;
if(a[i]==a[j])
for(int k=i;k<=j;k++)
a[k]=a[i];
else
for(int k=i;k<=j;k++)
{
if(k<=(i+j)/2)
a[k]=a[i];
else
a[k]=a[j];
}
cnt=max(cnt,(j-i)/2);
j++;
}
cout<<cnt<<'\n';
for(int i=1;i<=n;i++)
cout<<a[i]<<' ';
return 0;
}