题解:P10854 【MX-X2-T3】「Cfz Round 4」Ninelie
题目大意
对于一个长度为
解题思路
最大限制次数
显然,如果一个点当前不能被改变,那我们能通过改变它一侧的点,使它变成可以被改变状态。其实这就是一个递归求解的过程。
- 对于中点左侧的点,如果不能被改变,选择向左递归。
- 对于中点右侧的点,如果不能被改变,选择向右递归。
这样我们先钦定中间两个点,使其变成一样的(最多需要
AC 代码
#include<bits/stdc++.h>
using namespace std;
const int N = 2e3+5;
int n,a[N],r,ans,op[2000005],limit;
inline void change(int x,int o)
{
if(x==1||x==n||a[x-1]!=a[x+1]) return a[x]^=1,op[++ans]=x,void(0);
if(o) change(x-1,o),a[x]^=1,op[++ans]=x;
else change(x+1,o),a[x]^=1,op[++ans]=x;
}
int main()
{
scanf("%d%d",&n,&limit);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int l=n>>1,r=l+1;
if(a[l]!=a[r]) change(l,1);
l--,r++;
while(l>=1) a[l]!=a[l+1]?change(l,1),l--:l--;
while(r<=n) a[r]!=a[r-1]?change(r,0),r++:r++;
printf("%d\n",ans);
for(int i=1;i<=ans;i++) printf("%d ",op[i]);
return 0;
}