CodeForces 590A Median Smoothing
构造题。
答案可以o(n)构造出来。首先要发现规律。只有01交替的串才可能变化,变化规律如下:
1开头,长度为偶数(0结尾):变(len-2)/2次 变完后 前半1 后半0
1开头,长度为奇数(1结尾):变(len-1)/2次 变完后 全为1
0开头,长度为偶数(1结尾):变(len-2)/2次 变完后 前半0 后半1
0开头,长度为奇数(0结尾):变(len-1)/2次 变完后 全为0
然后就是在原串中寻找01交替串,然后按照上述规律进行变换。
#include <cstdio> #include <cstring> #include <vector> #include<cmath> #include<ctime> #include<cstdlib> using namespace std; const int maxn=550000; int n; int a[maxn],b[maxn]; struct X { int st,en; int num; }s[maxn]; int tot; int main() { while(~scanf("%d",&n)) { for(int i=1; i<=n; i++) scanf("%d",&a[i]); a[0]=a[1]; a[n+1]=a[n]; a[n+2]=9545664; tot=0; int pos=0; for(int i=pos;i<=n+1;) { for(int j=i;j<=n+2;j++) { if(a[j]==a[i]) continue; else { if(j-1!=i) { s[tot].st=i; s[tot].en=j-1; s[tot].num=a[i]; tot++; } i=j; break; } } } int ans=0; for(int i=1;i<=n;i++) b[i]=a[i]; for(int i=0;i<tot+1;i++) { int len=s[i+1].st-s[i].en+1; if(s[i].num==1) { if(s[i+1].num==0) { ans=max(ans,(len-2)/2); for(int k=s[i].en;k<=s[i].en+len/2-1;k++) b[k]=1; for(int k=s[i].en+len/2;k<=s[i+1].st;k++) b[k]=0; } else { ans=max(ans,(len-1)/2); for(int k=s[i].en;k<=s[i].en+len/2-1;k++) b[k]=1; for(int k=s[i].en+len/2;k<=s[i+1].st;k++) b[k]=1; } } else { if(s[i+1].num==0) { ans=max(ans,(len-1)/2); for(int k=s[i].en;k<=s[i].en+len/2-1;k++) b[k]=0; for(int k=s[i].en+len/2;k<=s[i+1].st;k++) b[k]=0; } else { ans=max(ans,(len-2)/2); for(int k=s[i].en;k<=s[i].en+len/2-1;k++) b[k]=0; for(int k=s[i].en+len/2;k<=s[i+1].st;k++) b[k]=1; } } } printf("%d\n",ans); for(int i=1; i<=n; i++) printf("%d ",b[i]); printf("\n"); } return 0; }