当前位置: 首页 > 工具软件 > EUGene > 使用案例 >

C. Eugene and an array(思路,前缀)

公良天逸
2023-12-01

C. Eugene and an array

题意:给你n个数的数组,让你求它的子区间和中不含0的区间总数。
思路:前缀,我们可以记录这个数组的前缀,如果 p r e [ i ] = = p r e [ j ] pre[i]==pre[j] pre[i]==pre[j],那么就说明 i 到 j i到j ij之间和为0,那我们记录的就不能包含这个区间。这道题我们用 m a p map map寻找一个区间和为0的开头位置。
我们 a n s ans ans每次记录就是从第一个不含有完整0区间的地方到当前位置的区间数。即 a n s + = i − q − 1 ans+=i-q-1 ans+=iq1((刚开始也是没想到记录区间的方法,看了大佬的博客,这个地方想了好久才明白) 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#include<queue>
#include<vector>
#include<math.h>
#include<bits/stdc++.h>
#include<map>
using namespace std;
#define LL long long
const int N=1e5+10;
map<LL,LL>p;
int main()
{
    ios::sync_with_stdio(false);
	cin.tie(0);
	int n;
    cin>>n;
    LL s=0;
    LL x;
    p[0]=0;
    LL q=-1;
    LL ans=0;
    for(int i=1;i<=n;i++)
    {
        cin>>x;
        s+=x;
        if(p.count(s))
        {
            q=max(q,p[s]);
            //printf("%lld\n",p[s]);
        }
        ans+=i-q-1;
       // printf("%lld** ",ans);
        p[s]=i;
    }
    cout<<ans<<endl;
    return 0;
}

 类似资料: