1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <bits/stdc++.h>

using namespace std;

const int N = 50005;
const int LIM = 1E6;

int n;
int t[N];
int dp1[N], dp2[N], dp3[N], dp4[N];

int main() {
    ios_base::sync_with_stdio(0);

    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> t[i];
        dp1[i] = dp2[i] = dp3[i] = dp4[i] = LIM + 1;


    }

    dp1[1] = dp3[1] = 0;
    dp2[1] = dp4[1] = 1;

    for (int i = 2; i <= n; i++) {
        if (t[i - 1] > t[i]) {
            dp1[i] = min(dp1[i], min(dp3[i - 1], dp4[i - 1]));
            dp2[i] = min(dp2[i], min(dp3[i - 1], dp4[i - 1]) + 1);

            if (t[i] != -LIM) dp3[i] = min(dp3[i], dp2[i - 1]);
            if (t[i - 1] != LIM) dp4[i] = min(dp4[i], dp1[i - 1] + 1);
            dp4[i] = min(dp4[i], dp2[i - 1] + 1);
            
        }
        else if (t[i - 1] < t[i]) {
            if (t[i] != LIM) dp1[i] = min(dp1[i], dp4[i - 1]);
            if (t[i - 1] != -LIM) dp2[i] = min(dp2[i], dp3[i - 1] + 1);
            dp2[i] = min(dp2[i], dp4[i - 1] + 1);

            dp3[i] = min(dp3[i], min(dp1[i - 1], dp2[i - 1]));
            dp4[i] = min(dp4[i], min(dp1[i - 1], dp2[i - 1]) + 1);
        }
        else if (t[i - 1] == t[i]) {
            if (t[i] != LIM) dp1[i] = min(dp1[i], dp4[i - 1]);
            dp2[i] = min(dp2[i], dp4[i - 1] + 1);
            if (t[i - 1] != -LIM) dp2[i] = min(dp2[i], dp3[i - 1] + 1);

            if (t[i] != -LIM) dp3[i] = min(dp3[i], dp2[i - 1]);
            dp4[i] = min(dp4[i], dp2[i - 1] + 1);
            if (t[i - 1] != LIM) dp4[i] = min(dp4[i], dp1[i - 1] + 1);

        }

    }

    // for (int i = 1; i <= n; i++) {
    //     cout << i << ":" << endl;
    //     cout << "MNIEJSZE BEZ ZMIAN" << endl << dp1[i] << endl << "MNIEJSZE ZMIANA" << endl << 
    //         dp2[i] << endl << "WIEKSZE BEZ ZMIAN" << endl << dp3[i] << endl << "WIEKSZE ZMIANA" << endl << dp4[i] << endl << endl;
    // }

    cout << min(dp1[n], min(dp2[n], min(dp3[n], dp4[n])));
}