3.帕鲁服务器崩坏【算法赛】 - 蓝桥云课 (lanqiao.cn)
思想
需要考虑s[i]位置是'1',s[i+1]位置是'1'或'0'的情况
如果s[i+1]位置是'1'那么开启失败,否则开启成功
我刚开始这样写的,只能过80%的数据:
#include <iostream>
using namespace std;
const int N=2e5+10;
int sum[N];
int m,n;
string s;
int main()
{
cin>>n;
cin>>s;
cin>>m;
s=" "+s;
while(m--)
{
int cnt=0;
int l,r;cin>>l>>r;
for(int i=l;i<=r;i++)
{
if(s[i]=='1'&&s[i]!=s[i+1]&&i+1<=r)
cnt++;
}
cout<<cnt<<endl;
}
return 0;
}
正解是前缀和dp解法
#include <iostream>
using namespace std;
const int N=2e5+10;
int sum[N];
int m,n;
string s;
int main()
{
cin>>n;
cin>>s;
cin>>m;
s=" "+s;
for(int i=1;i<=n;i++)
{
if(s[i]=='1'&&s[i+1]=='0') sum[i]=sum[i-1]+1;
else sum[i]=sum[i-1];
}
while(m--)
{
int l,r;cin>>l>>r;
cout<<sum[r-1]-sum[l-1]<<endl;
}
return 0;
}