前缀和(Pro Max)

· · 算法·理论

这次,我们继续来讲前缀和的进阶应用 。

P3131

注意!

$L_0=0$ !!! $L_0=0$ !!!

Code:

#include<bits/stdc++.h>
using namespace std;
int sum[100005],n,a[100005],l[105],r[105];
int main()
{
    cin>>n;
    for(int i=1;i<=n;++i)
    {
        cin>>a[i];
        sum[i]=(sum[i-1]+a[i])%7;
    }
    for(int i=1;i<=n;++i)
    {
        if(!l[sum[i]]) l[sum[i]]=i;
    }
    for(int i=n;i>=1;--i)
    {
        if(!r[sum[i]]) r[sum[i]]=i;
    }
    int mx=-1e9;
    l[0]=0;
    for(int i=0;i<=6;++i)
    {
        mx=max(mx,r[i]-l[i]);
    }
    cout<<mx;
    return 0;
}

P8649 k 倍区间

Code:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,k,a[100005];
int sum[100005];
int vis[100005];
int main()
{
    cin>>n>>k;
    for(int i=1;i<=n;++i)
    {
        cin>>a[i];
        sum[i]=(sum[i-1]+a[i])%k;
    }
    vis[0]=1;
    ll ans=0;
    for(int i=1;i<=n;++i)
    {
        ans+=vis[sum[i]];
        vis[sum[i]]++;
    }
    cout<<ans;
    return 0;
}

CF466C Number of Ways

Code:

#include<bits/stdc++.h>
#define short long long
using namespace std;
short n,a[1000005],sum[1000005],pre[1000005],cnt;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin>>n;
    for(short i=1;i<=n;++i)
    {
        cin>>a[i];
        sum[i]=sum[i-1]+a[i];
        cnt+=a[i];
    }
    if(cnt%3!=0)
    {
        cout<<0;
        return 0;
    }
    for(short i=1;i<=n;++i)
    {
        pre[i]=pre[i-1]+(sum[i]==(cnt*2/3));
    }
    short ans=0;
    for(short i=1;i<n;++i)
    {
        if(sum[i]==cnt/3)
        {
            ans+=(pre[n-1]-pre[i]);
        }
    }
    cout<<ans;
    return 0;
}

The End.