我感觉我的做法在代码实现上比较容易,特此写一篇题解。
从奇偶交替可以想到一些很复杂的分讨做法,但是本质上分类就是区间起始下标的奇偶和数字的奇偶。
因为奇偶转换只需要一次操作,所以只需要关心 的奇偶性即可。不妨就令
表示
是奇数,反之同理,答案肯定是一样的。
可以发现一段区间奇偶交替等价于每个 都跟其下标的奇偶性相同或相反,于是代码非常好写。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN=1e6+50;
int N,M;
int a[MAXN];
int Sum[MAXN];
int main()
{
cin>>N>>M;
for(int i=1;i<=N;i++)
{
cin>>a[i];
a[i]&=1;
a[i]=(a[i]^(i&1));
}
int ans=1e9;
for(int i=1;i<=N;i++)
{
Sum[i]=Sum[i-1]+a[i];
}
for(int i=1;i<=N-M+1;i++)
{
ans=min(ans,min(Sum[i+M-1]-Sum[i-1],M-(Sum[i+M-1]-Sum[i-1])));
}
cout<<ans;
}