1. 程式人生 > >Array Division CodeForces - 808D (構造+實現)

Array Division CodeForces - 808D (構造+實現)

inf 如果能 pla 平分 HERE tor cin ble star

Vasya has an array a consisting of positive integer numbers. Vasya wants to divide this array into two non-empty consecutive parts (the prefix and the suffix) so that the sum of all elements in the first part equals to the sum of elements in the second part. It is not always possible, so Vasya will move some element before dividing the array (Vasya will erase some element and insert it into an arbitrary position).

Inserting an element in the same position he was erased from is also considered moving.

Can Vasya divide the array after choosing the right element to move and its new position?

Input

The first line contains single integer n (1 ≤ n ≤ 100000) — the size of the array.

The second line contains n integers a1, a2... an (1 ≤ ai ≤ 109) — the elements of the array.

Output

Print YES if Vasya can divide the array after moving one element. Otherwise print NO.

Examples

Input
3
1 3 2
Output
YES
Input
5
1 2 3 4 5
Output
NO
Input
5
2 2 3 4 5
Output
YES

Note

In the first example Vasya can move the second element to the end of the array.

In the second example no move can make the division possible.

In the third example Vasya can move the fourth element by one position to the left.

題意:給你一個包含N個數的數組,讓你把這N個數分成兩個非空的集合,使這兩個集合的sum和相等。

如果能就輸出yes,否就no

思路: 首先根據全部元素的sum和如果為奇數,直接輸出NO。

否則,進入下面的操作。

創建兩個map,即m1和m2

一個額外變量 LL temp=0ll,用來記錄劃分的第一個集合的sum值

m2代表第一個集合中存在的元素數量,

m1代表未加入到第一個集合中的元素的存在數量。

掃一遍,把元素都加入到一個m1中,

然後從1~n循環遍歷數組,

sum/=2ll; // sum就代表了平分後每一個集合要等於的數值。

每一次執行

temp+=a[i];// 把a[i]加入到集合中

m1[a[i]] --; // 從剩下的數集合中刪除

if(m1[sum-temp])

{
  cout<<"YES"<<endl;

}

// 即 如果剩下的元素中存在 sum-temp這個數,那麽直接把那個數再加入到集合中就可以完成平分,所以使yes

if(m2[temp-sum])
{
printf("YES\n");
return 0;
}

// 即如果第一個集合中存在temp-sum這個元素,那麽刪除它就可以實現平分。

都沒有的話,最後輸出no

細節見我的AC代碼:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), ‘\0‘, sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
using namespace std;
typedef long long ll;
inline void getInt(int* p);
const int maxn=1000010;
const int inf=0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
int n;
int a[maxn];
ll sum=0ll;
map<ll,ll> m1,m2;
void init()
{
    m1.clear();
    m2.clear();
}
int main()
{
    gg(n);
    repd(i,1,n)
    {
        gg(a[i]);
        sum+=1ll*a[i];
        m1[a[i]]++;
    }
    if(sum&1)
    {
        // odd
        printf("NO\n");
        return 0;
    }
    sum/=2ll;
    ll temp=0ll;
    repd(i,1,n)
    {
        temp+=a[i];
        m1[a[i]]--;// right delete
        m2[a[i]]++;// left plus 
        if(m1[sum-temp])
        {
            printf("YES\n");
            return 0;
        }
        if(m2[temp-sum])
        {
            printf("YES\n");
            return 0;
        }   
    }
    printf("NO\n");
    return 0;
}

inline void getInt(int* p) {
    char ch;
    do {
        ch = getchar();
    } while (ch ==   || ch == \n);
    if (ch == -) {
        *p = -(getchar() - 0);
        while ((ch = getchar()) >= 0 && ch <= 9) {
            *p = *p * 10 - ch + 0;
        }
    }
    else {
        *p = ch - 0;
        while ((ch = getchar()) >= 0 && ch <= 9) {
            *p = *p * 10 + ch - 0;
        }
    }
}

Array Division CodeForces - 808D (構造+實現)