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

 

posted @ 2016-05-09 10:14  Fighting_Heart  阅读(157)  评论(0编辑  收藏  举报