func_code_string: #include <bits/stdc++.h>   using namespace std;   long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }   void vrikodara(long long n = 12) {     ios_base::sync_with_stdio(0);     cin.tie(0);     cout.tie(0);     cout << setprecision(n) << fixed;   }   long long lb = 100000;   void solve() {     long long n;     cin >> n;     set<long long> s, so, se;     for (long long i = 1; i <= n; i++) s.insert(i);     vector<long long> p(n + 2);     for (long long i = 1; i <= n; i++) {       cin >> p[i];       if (p[i]) s.erase(p[i]);     }     if (n == 1) {       cout <<  0 ;       return;     }     for (auto i : s)       if (i & 1)         so.insert(i);       else         se.insert(i);     set<pair<long long, long long> > sso, sse;     for (long long i = 1; i <= n; i++) {       if (!p[i]) {         if (!p[i - 1]) continue;         long long x = i, y = i;         while (y <= n && !p[y]) y++;         if (y > n) break;         if (p[x - 1] & 1 && p[y] & 1) {           sso.insert({y - x, x});         } else if (p[x - 1] % 2 == 0 && p[y] % 2 == 0) {           sse.insert({y - x, x});         }         i = y;       }     }     if (s.size() >= n - 1) {       cout <<  1 ;       return;     }     while (!sso.empty() && !so.empty()) {       auto q = *sso.begin();       long long x = q.second;       long long y = q.first + q.second;       if (q.first > so.size()) break;       sso.erase(q);       while (x < y && !so.empty()) {         long long j = *so.begin();         so.erase(j);         p[x] = j;         x++;       }       if (x < y) {         sso.insert({y - x, x});         break;       }     }     while (!sse.empty() && !se.empty()) {       auto q = *sse.begin();       long long x = q.second, y = q.first + q.second;       if (q.first > se.size()) break;       sse.erase(q);       while (x < y && !se.empty()) {         long long j = *se.begin();         se.erase(j);         p[x] = j;         x++;       }       if (x < y) {         sse.insert({y - x, x});         break;       }     }     long long d1 = 1;     while (d1 <= n && !p[d1]) d1++;     d1--;     long long d2 = n;     while (d2 > 0 && !p[d2]) d2--;     if (d1 && d2 < n) {       if (d1 > n - d2) {         d2++;         if (p[d2 - 1] & 1) {           while (!so.empty() && d2 <= n) {             long long j = *so.begin();             so.erase(j);             p[d2] = j;             d2++;           }         } else {           while (!se.empty() && d2 <= n) {             long long j = *se.begin();             se.erase(j);             p[d2] = j;             d2++;           }         }       } else {         if (p[d1 + 1] & 1) {           while (!so.empty() && d1 > 0) {             long long j = *so.begin();             so.erase(j);             p[d1] = j;             d1--;           }         } else {           while (!se.empty() && d1 > 0) {             long long j = *se.begin();             se.erase(j);             p[d1] = j;             d1--;           }         }       }     }     d1 = 1;     while (d1 <= n && !p[d1]) d1++;     d1--;     d2 = n;     while (d2 > 0 && !p[d2]) d2--;     d2++;     if (p[1] == 0) {       if (p[d1 + 1] & 1) {         while (!so.empty() && d1 > 0) {           long long j = *so.begin();           so.erase(j);           p[d1] = j;           d1--;         }       } else {         while (!se.empty() && d1 > 0) {           long long j = *se.begin();           se.erase(j);           p[d1] = j;           d1--;         }       }     }     if (p[n] == 0) {       if (p[d2 - 1] & 1) {         while (!so.empty() && d2 <= n) {           long long j = *so.begin();           so.erase(j);           p[d2] = j;           d2++;         }       } else {         while (!se.empty() && d2 <= n) {           long long j = *se.begin();           se.erase(j);           p[d2] = j;           d2++;         }       }     }     for (long long i = 1; i <= n && !so.empty() && !se.empty(); i++) {       if (!p[i]) {         if (p[i - 1] & 1) {           long long j = *so.begin();           so.erase(j);           p[i] = j;         } else {           long long j = *se.begin();           se.erase(j);           p[i] = j;         }       }     }     long long i = 1;     for (auto j : se) {       while (p[i] && i <= n) i++;       p[i] = j;     }     for (auto j : so) {       while (p[i] && i <= n) i++;       p[i] = j;     }     long long ans = 0;     for (long long i = 2; i <= n; i++) {       if (p[i] % 2 != p[i - 1] % 2) ans++;     }     cout << ans;   }   int32_t main() {     vrikodara();     long long t = 1;     while (t--) {       solve();     }     return 0;   }   