4.9問題の日常の問題の解決

ユージンと配列

知識ポイントを含みます:

  • ダブルポインタ/プレフィックスと

解決:

  • \(配列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;
}

おすすめ

転載: www.cnblogs.com/QFNU-ACM/p/12666177.html