Fruit Sequences

F. Fruit Sequences

参考:tutorial

遇到这种求\(\sum_{l=1}^n\sum_{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;
}
posted @ 2020-12-04 15:58  caoanda  阅读(79)  评论(0编辑  收藏  举报