zoukankan      html  css  js  c++  java
  • Codeforces 1333 C. Eugene and an array

    • 一个数组当它的所有子数组和都不为0时,它是一个good数组。给一个长为n的数组问所给数组子数组中good数组个数。
    • 如果两个不同位置的前缀和值相等,那这两个位置之间的数组和为0。对每个位置si考虑其贡献,用top表示一个限制,就是si和top以前的位置构成的数组一定包含一个和为0的子数组。所以si的贡献为si-(top - 1);
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N = 3e5 + 105;
    const int mod = 998244353;
    const double Pi = acos(- 1.0);
    const int INF = 0x3f3f3f3f;
    
    ll n, m;
    ll sum[N];
    ll a[N], res[N];
    map<ll, ll>mp;
    
    int main()
    {
        scanf("%lld",&n);
        int flag = 0;
        ll val = 0;
        ll top = 0;
        for(int i = 1; i <= n; ++ i){
            scanf("%lld",&a[i]);
            sum[i] = sum[i - 1] + a[i];
            if(!mp[sum[i]]){
                if(!sum[i]) top = max(top, 1ll);
            }
            else top = max(top, mp[sum[i]] + 1);
            val += i - top;
            mp[sum[i]] = i;
        }
        printf("%lld
    ", val);
        return 0;
    }
    
    
  • 相关阅读:
    Windows网络编程经验小结
    异步Socket服务器与客户端
    用C#实现C/S模式下软件自动在线升级
    Linux 安装字体
    word 生成目录
    Linux sar使用
    yum 使用说明
    HASH JOIN算法
    row cache lock
    cursor: pin S
  • 原文地址:https://www.cnblogs.com/A-sc/p/12805852.html
Copyright © 2011-2022 走看看