Language: C++

#include<bits/stdc++.h>
using namespace std;
#define ll long long                                    // long long省略
#define pb push_back                                    // push_back省略
#define mp make_pair                                    // make_pair省略
#define fi first                                        // first省略
#define se second                                       // second省略
#define itn int                                         // int誤字保険
#define count cout                                      // cout誤字保険
#define vecotr vector                                   // vector誤字保険
#define ednl endl                                       // endl誤字保険
#define opt() cin.tie(0); ios::sync_with_stdio(false)   // 入出力速度改善

#define rep(i,l,r) for(ll i=(l);i<(r);i++)               // 範囲[l, r)で刻み1のfor文(順方向)
#define repp(i,l,r,k) for(ll i=(l);i<(r);i+=(k))         // 範囲[l, r)で刻みkのfor文(順方向)
#define rrep(i,l,r) for(ll i=(r-1);i>=(l);i--)           // 範囲[l, r)で刻み1のfor文(逆方向)
#define rrepp(i,l,r,k) for(ll i=(r-1);i>=(l);i-=(k))     // 範囲[l, r)で刻みkのfor文(逆方向)
#define all(x) (x).begin(), (x).end()                   // vectorのポインタ位置指定用
#define max(p,q)((p)>(q)?(p):(q))                       // max拡張
#define min(p,q)((p)<(q)?(p):(q))                       // min拡張
#define bit(n,m)(((n)>>(m))&1)                          // 変数nのm番目のbitを取り出す

template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0; }

int dy[]={0, 1, 0, -1};                                 // 4方向近傍
int dx[]={1, 0, -1, 0};                                 // 4方向近傍

#define INF ((1LL<<62)-(1LL<<31))
//#define MOD 998244353
#define MOD 1000000007
#define invp(a,p) pom(a,p-2,p)

////////////////////////////////////////////////////////////////////////////////////////
int main(){
    ll n; cin >> n;
    ll a[n]; rep(i,0,n) cin >> a[i];
    
    //1. 累積和に0がないか?
    //   iで累積和が0になるなら、iから先に+1
    //2. 累積和の符号が反転しない
    //   反転するまで1を加える、1を引く
    ll csum[n];
    csum[0] = a[0];
    rep(i,1,n){
      	csum[i] = csum[i-1] + a[i];
      	//cout << csum[i] << ednl;
    }

    //初手が0じゃない場合
    if(csum[0] != 0){
        ll p1 = 0, m1 = 0;
        bool flag = (csum[0] > 0);
        rep(i,1,n){
            if((flag ? -1 : 1) * (csum[i] + p1 - m1) > 0){
                flag = !flag;
                continue;
            }else{
                if(flag){ //このステップでは負であるべき
                    m1 += csum[i] + p1 - m1 + 1;
                }else{ //このステップでは生であるべき
                    p1 += -(csum[i] + p1 - m1) + 1;
                }
            flag = !flag;
            }
        }
        ll res = p1 + m1;

        if(csum[0] > 0){
            p1 = 0; m1 = csum[0] + 1;
        }else{
            p1 = -csum[0] + 1; m1 = 0;
        }
        bool flag = !(csum[0] > 0);
        rep(i,1,n){
            if((flag ? -1 : 1) * (csum[i] + p1 - m1) > 0){
                flag = !flag;
                continue;
            }else{
                if(flag){ //このステップでは負であるべき
                    m1 += csum[i] + p1 - m1 + 1;
                }else{ //このステップでは生であるべき
                    p1 += -(csum[i] + p1 - m1) + 1;
                }
            flag = !flag;
            }
        }
        res = min(p1 + m1, res);
        cout << res << ednl;
    }else{
        //初手が0の場合で決め打ちで+1した場合
        ll p1 = 1, ll m1 = 0;
        flag = true;
        rep(i,1,n){
            if((flag ? -1 : 1) * (csum[i] + p1 - m1) > 0){
                flag = !flag;
                continue;
            }else{
                if(flag){ //このステップでは負であるべき
                    m1 += csum[i] + p1 - m1 + 1;
                }else{ //このステップでは生であるべき
                    p1 += -(csum[i] + p1 - m1) + 1;
                }
            flag = !flag;
            }
        }
        ll res = p1+m1;
        //初手が0の場合で決め打ちで-1した場合
        p1 = 0, m1 = 1;
        flag = false;
        rep(i,1,n){
            if((flag ? -1 : 1) * (csum[i] + p1 - m1) > 0){
                flag = !flag;
                continue;
            }else{
                if(flag){ //このステップでは負であるべき
                    m1 += csum[i] + p1 - m1 + 1;
                }else{ //このステップでは生であるべき
                    p1 += -(csum[i] + p1 - m1) + 1;
                }
            flag = !flag;
            }
        }
        res = min(res, p1+m1);
    }
    cout << res << ednl;
}

Compiler output:
a.cc: In function 'int main()':
a.cc:74:14: error: redeclaration of 'bool flag'
   74 |         bool flag = !(csum[0] > 0);
      |              ^~~~
a.cc:53:14: note: 'bool flag' previously declared here
   53 |         bool flag = (csum[0] > 0);
      |              ^~~~
a.cc:3:12: error: expected unqualified-id before 'long'
    3 | #define ll long long                                    // long long省略
      |            ^~~~
a.cc:92:20: note: in expansion of macro 'll'
   92 |         ll p1 = 1, ll m1 = 0;
      |                    ^~
a.cc:93:9: error: 'flag' was not declared in this scope
   93 |         flag = true;
      |         ^~~~
a.cc:95:50: error: 'm1' was not declared in this scope; did you mean 'p1'?
   95 |             if((flag ? -1 : 1) * (csum[i] + p1 - m1) > 0){
      |                                                  ^~
      |                                                  p1
a.cc:107:21: error: 'm1' was not declared in this scope; did you mean 'p1'?
  107 |         ll res = p1+m1;
      |                     ^~
      |                     p1
a.cc:126:13: error: 'res' was not declared in this scope; did you mean 'rep'?
  126 |     cout << res << ednl;
      |             ^~~
      |             rep