P2882 [USACO07MAR]Face The Right Way G

首先我们需要枚举\(K\),对每个\(K\)我们都要从最左端开始来考虑\(N\)头牛的情况,此时最坏情况下需要进行\(N-K+1\)次反转操作,而每次操作又要反转\(K\)头牛,于是总的复杂度为\(O(N^3)\)

对区间反转的部分考虑使用差分,每次只修改\(i \sim i+k−1\),通过前缀和求解每一位是否反转。

反转奇数次使方向相反,偶数次使方向不变。最后的总复杂度是\(O(n^2)\)

const int N=5010;
int cow[N];//1:F, 0:B
int b[N];
int n;

int solve(int k)
{
    memset(b,0,sizeof b);

    int res=0;
    for(int i=1;i+k-1<=n;i++)
    {
        b[i]+=b[i-1];
        if((cow[i]+b[i]) % 2 == 0)
        {
            res++;
            b[i]++;
            b[i+k]--;
        }
    }

    for(int i=n-k+2;i<=n;i++)
    {
        b[i]+=b[i-1];
        if((cow[i]+b[i]) % 2 == 0)
            return INF;
    }
    return res;
}

int main()
{
    cin>>n;

    for(int i=1;i<=n;i++)
    {
        char c;
        cin>>c;
        if(c == 'B') cow[i]=0;
        else cow[i]=1;
    }

    int resk=0,resm=INF;
    for(int i=1;i<=n;i++)
    {
        int step=solve(i);
        if(step < resm)
        {
            resk=i;
            resm=step;
        }
    }

    cout<<resk<<' '<<resm<<endl;
    //system("pause");
    return 0;
}
posted @ 2021-03-20 10:15  Dazzling!  阅读(26)  评论(0编辑  收藏  举报