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