ユージンと配列
知識ポイントを含みます:
解決:
- \(配列aを与えるよう単に要約問題の意味は、Bは、あなたが、配列のすべて、二つの条件を満たすように配列bの必要性を見つけてみましょう:\)
- \(条件1、Bアレイ\連続必要アレイ()の部分配列です)
- \(条件2、Bの連続必要アレイ()のサブアレイ0に等しくないと和\)
- \(N = 1E5、暴力解けない\)
- \(サブアレイが連続ため、[X 1]を仮定し、そしてなど、[1、y]は、また、その番組である[X + 1、Y]が0であり、そしてこのピースアレイ\)
- $この機能、右固定点yによれば、我々は左点X + 2、X + 3、X + 4 ...... Y $のみを取ることができます
- \(左点X + 1以下である、[X + 1、Y]配列とこの部分が0である場合、条件を満たさないため\撮影)
- \(:\答えを更新し、左の点で記録された地図と接頭辞、最大でそれの保存、あらゆる権利のポイントを列挙するために)O(nはアプローチがあるので)
STD:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 200005;
ll a[maxn],pre[maxn];
int main()
{
int n , l = 0;
ll ans = 0;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i],pre[i] = pre[i-1] + a[i];
map<ll , int > mp;
mp[0] = 0;
for(int i=1;i<=n;i++){
if(mp[pre[i]] || pre[i] == 0)
l = max(l , mp[pre[i]] + 1);
ans += 1ll*(i - l);
mp[pre[i]] = i;
}
cout<<ans<<endl;
return 0;
}