Problem:
Score : 300 points

Problem Statement

You are given an integer sequence of length N. The i-th term in the sequence is a_i.
In one operation, you can select a term and either increment or decrement it by one.

At least how many operations are necessary to satisfy the following conditions?

For every i (1≤i≤n), the sum of the terms from the 1-st through i-th term is not zero.

For every i (1≤i≤n-1), the sign of the sum of the terms from the 1-st through i-th term, is different from the sign of the sum of the terms from the 1-st through (i+1)-th term.

Constraints

2 ≤ n ≤ 10^5

|a_i| ≤ 10^9

Each a_i is an integer.

Input

Input is given from Standard Input in the following format:

n
a_1 a_2 ... a_n

Output

Print the minimum necessary count of operations.

Sample Input 1

4
1 -3 1 0

Sample Output 1

4

For example, the given sequence can be transformed into 1, -2, 2, -2 by four operations. The sums of the first one, two, three and four terms are 1, -1, 1 and -1, respectively, which satisfy the conditions.

Sample Input 2

5
3 -6 4 -5 7

Sample Output 2

0

The given sequence already satisfies the conditions.

Sample Input 3

6
-1 4 3 2 -5 4

Sample Output 3

8

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)


#include<iostream>
#include<math.h>

using namespace std;

void sum(int *N,long *S, int n);
//void add(double* S,int n, int del,int k);
int main()
{

  int *N;
  long *S;
  long count_eve =0,count_odd=0,n;
  int j = 0,k=0;
  cin >> n;
  N = new int[n];
  S = new long[n];

  for(int i=0; i<n; i++){
    cin >> N[i];
  }
  sum(N,S,n);
  /*for(int i=0; i<n; i++){
    cout <<"S :" <<S[i] <<"N"<<N[i]<<endl;
  }*/
  int del1=0,del2=0;
  while(j != n)
  {
    //偶数が正，奇数が負でやるとき
    if(j%2==0 && S[j]+del1<=  0)
    {
      //cout <<"del1 :" <<del1 << endl;
      count_eve += abs(S[j]+del1) + 1;
      del1 +=  abs(S[j]+del1) +1 ;
      //add(S,n,abs(S[j])+1,j);
      //cout << count_eve <<endl;

    }
    else if(j%2==1 && S[j]+del1>= 0)
    {
      //cout <<"del1:" <<del1<< endl;
      count_eve += abs(S[j]+ del1) + 1;
      del1 += -abs(S[j]+del1) - 1 ;
      //add(S,n,-abs(S[j])-1,j);
      //cout << count_eve <<endl;
    }
  j++;
  }

  //偶数が負，奇数が正のとき
  sum(N,S,n);
  while(k != n)
  {
    if(k%2==0 && S[k]+del2>=  0)
    {
      //  cout <<"del2 :" <<del2 << endl;
      count_odd += abs(S[k]+del2) + 1;
      del2 += -abs(S[k]+del2) - 1 ;
      //add(S,n,-abs(S[k]) - 1,k+1);

      //cout <<"偶数 :" <<count_odd <<" k :"<<k<<" S[k] " <<S[k] <<endl;
    }
  else if(k%2==1 && S[k]+del2<= 0)
  {
    count_odd += abs(S[k]+del2) + 1;
    del2 += abs(S[k]+del2) + 1 ;
    //add(S,n,abs(S[k]) + 1,k);
    //cout <<"奇数" <<count_odd <<endl;
  }
    k++;    //cout <<"k" <<k << "S[k] "<<S[k] <<endl;
  }
  cout << min(count_eve,count_odd) << endl;
  //cout << count_odd <<" " << count_eve << endl;
  delete [] N;
  delete [] S;
  return 0;

}

void sum(int* N,long *S,int n)
{
  S[0] = N[0];
  for(int i=1; i<n; i++)  S[i] = S[i-1] + N[i];
  /*for(int i=0; i<n; i++){
    cout <<"S :" <<S[i] <<"N"<<N[i]<<endl;
  }*/
}

void add(int *S,int n,int del,int k)
{
  for(int i=k; i<n+1; i++)  S[i] += del;
}