题解:P10608 双人游戏
题解:P10608 双人游戏
题意
给予你一个长度为
接下来有
小 R 希望游戏结束后棋子组成的极长同色连续段数尽可能多,而小 M 则希望其尽可能少。
每个人都会按照自己的意愿做最有做法。
求最终的极长同色连续段数。
思路
我们可以先将
-
若
c_{i} 是W 或B ,则不用管它。 -
易得,若
c_{i} 是R ,则肯定是将它改成与c_{i-1} 相反。 -
易得,若
c_{i} 是M ,则肯定是将它改成与c_{i-1} 相同。
但这么写会遗漏前面一大堆空格子的情况,这样的话,只要从尾到头的重复上述步骤即可。
如果全是空格子,上述步骤是不起作用的,易得当且仅当这种情况下
代码
#include<bits/stdc++.h>
using namespace std;
int n,m,s[200005],x;
string c;
char A;
int main(){
cin>>n>>m>>c;
c=' '+c;
for(int i=1;i<=m;i++){
cin>>A>>x;
if(m==n&&i==1)A='W';
c[x]=A;
}
// cout<<c<<"\n";
for(int i=1;i<=n;i++){
if(c[i]=='R'){
if(c[i-1]=='B')c[i]='W';
else if(c[i-1]=='W')c[i]='B';
}else if(c[i]=='M'){
if(c[i-1]=='B')c[i]='B';
else if(c[i-1]=='W')c[i]='W';
}
//cout<<c<<"\n";
}
for(int i=n;i>=1;i--){
if(c[i]=='R'){
if(c[i+1]=='B')c[i]='W';
else if(c[i+1]=='W')c[i]='B';
}else if(c[i]=='M'){
if(c[i+1]=='B')c[i]='B';
else if(c[i+1]=='W')c[i]='W';
}
//cout<<c<<"\n";
}
// cout<<c<<"\n";
int ans=1;
for(int i=2;i<=n;i++)if(c[i]!=c[i-1])ans++;
cout<<ans;
return 0;
}