题解:P10608 双人游戏
前言
我赛时傻了,想到这个解法后自我否定掉了,痛失前
思路
首先很显然各自都知道对方的操作,那么就相当于操作的先后没用。
那么我们可以把每个
- 如果它是
\tt W 或\tt B ,那么啥都不用做; - 如果它是
\tt R ,因为小 R 是想让极长同色连续段数尽量多,所以他肯定会染与s_{i-1} 相反的颜色; - 如果它是
\tt M ,因为小 M 是想让极长同色连续段数尽量少,所以他肯定会染与s_{i-1} 相同的颜色;
但是我们注意到如果这样搞,在前面有一连串空棋盘时,前面都没法被进行有效操作。
那么很明显我们可以再倒着来一遍就行了啊,这样前面的空棋盘也能被处理到。
可是我们发现还有一个边界:
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,m,ans;
string s;
char c;
int k;
signed main(){
ios::sync_with_stdio(0);
cin.tie(nullptr);
cin>>n>>m>>s;s=' '+s;
for(int i=1;i<=m;i++){
cin>>c>>k;
if(m==n&&i==1) s[k]='W';
else s[k]=c;
}
for(int i=1;i<=n;i++){
if(s[i]=='R'){
if(s[i-1]=='B') s[i]='W';
if(s[i-1]=='W') s[i]='B';
}
if(s[i]=='M'){
if(s[i-1]=='B') s[i]='B';
if(s[i-1]=='W') s[i]='W';
}
}
for(int i=n;i>=1;i--){
if(s[i]=='R'){
if(s[i+1]=='B') s[i]='W';
if(s[i+1]=='W') s[i]='B';
}
if(s[i]=='M'){
if(s[i+1]=='B') s[i]='B';
if(s[i+1]=='W') s[i]='W';
}
}
for(int i=1;i<=n;i++){
if(s[i]!=s[i-1]) ans++;
}
cout<<ans;
return 0;
}
upd:修改了一些笔误。