dousha的篮球
解题思路
①、每次改变字符串,连续 ‘1’ 的区间数量,有三种情况:增加一次、减少一次或不变。
②、通过特判,找到影响连续 ‘1’ 的区间数量的变化情况。
ps:输入、输出较大,建议用scanf()与printf().
#include<bits/stdc++.h>
using namespace std;
char s[1000010];
int main(){
int n, q, flag=0, cnt=0;
scanf("%d%d%s", &n, &q, s);
for(int i=0; i<n; i++){
if(flag==0&&s[i]=='1'){
cnt++;
flag=1;
}
if(s[i]=='0') flag=0;
}
printf("%d\n", cnt);
for(int i=0; i<q; i++){
int xb;
scanf("%d", &xb);
xb--;
//0->1
if(s[xb]=='0'){
if(n>1){
if(xb<n-1&&xb>0){
if(s[xb-1]=='0'&&s[xb+1]=='0')
cnt++;
if(s[xb-1]=='1'&&s[xb+1]=='1')
cnt--;
}
else if(xb==n-1&&s[xb-1]=='0')
cnt++;
else if(xb==0&&s[xb+1]=='0')
cnt++;
}
else
cnt++;
s[xb]='1';
}
else{ //1->0
if(n>1){
if(xb<n-1&&xb>0){
if(s[xb-1]=='0'&&s[xb+1]=='0')
cnt--;
if(s[xb-1]=='1'&&s[xb+1]=='1')
cnt++;
}
else if(xb==n-1&&s[xb-1]=='0')
cnt--;
else if(xb==0&&s[xb+1]=='0')
cnt--;
}
else cnt--;
s[xb] = '0';
}
printf("%d\n", cnt);
}
return 0;
}