参考:tutorial
遇到这种求(sum_{l=1}^nsum_{r=l}^nf(l,r))的一般情况下都是固定一个端点,然后快速求解值即可。
这种题的解决办法就是寻找不同状态之间是如何转移的,然后要能够很快地转移过去,然后就可以得到答案了。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=5e5+5;
int s[maxn],bj[maxn];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int n;cin>>n;
for(int i=1;i<=n;++i){
char x;cin>>x;
s[i]=x-'0';
}
ll ans=0,sum=0;
for(int i=1;i<=n;++i){
if(!s[i]) ans+=sum;
else{
int l=i,r=i;
while(r<=n-1&&s[r+1]) r++;
for(int x=1;x<=r-l+1;++x){
sum+=l+x-1-bj[x];
ans+=sum;
bj[x]=r-x+1;
}
i=r;
}
}
cout<<ans<<endl;
return 0;
}