제출 #1287812

#제출 시각아이디문제언어결과실행 시간메모리
1287812hynmjLine Town (CCO23_day1problem3)C++20
0 / 25
1 ms648 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;
const long long N = 2e5 + 5;
int a[N];
const int inf = 1e18;
int dp[N][2][2]; // min operations, i = index, j= a[i] == -1  or else , k= operation pending , till i a is sorted;
void solve()
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        dp[i][0][0] = inf;
        dp[i][0][1] = inf;
        dp[i][1][0] = inf;
        dp[i][1][1] = inf;
        cin >> a[i];
    }

    if (n == 1)
    {
        cout << 0;
        return;
    }
    if (n == 2)
    {
        if (is_sorted(a, a + n))
        {
            cout << 0;
            return;
        }
        else
        {
            cout << -1;
            return;
        }
    }
    if (a[0] == -1)
    {
        dp[0][0][0] = 0;
        dp[0][1][1] = 1;
    }

    else if (a[0] == 1)
    {
        dp[0][0][1] = 1;
        dp[0][1][0] = 0;
    }
    for (int i = 1; i < n; i++)
    {
        // cout << a[i] << endl;
        if (a[i] == 1)
        {
            // changing it
            dp[i][0][1] = min(dp[i][0][1], dp[i - 1][0][0] + 1);
            dp[i][0][0] = min(dp[i][0][0], dp[i - 1][0][1]);
            // not changing it
            dp[i][1][0] = min(dp[i][1][0], dp[i - 1][0][0]);
            dp[i][1][0] = min(dp[i][1][0], dp[i - 1][1][0]);
        }
        else if (a[i] == -1)
        {
            // 1 -> changing it without cost
            dp[i][1][0] = min(dp[i][1][0], dp[i - 1][0][1]);
            dp[i][1][0] = min(dp[i][1][0], dp[i - 1][1][1]);
            // 1 -> changing it with cost
            dp[i][1][1] = min(dp[i][1][1], dp[i - 1][0][0] + 1);
            dp[i][1][1] = min(dp[i][1][1], dp[i - 1][1][0] + 1);
            // 2 -> not changing it
            dp[i][0][0] = min(dp[i][0][1], dp[i - 1][0][0]);
        }
        // cout << min(dp[i][1][0], dp[i][0][0]) << ' ';
    }
    // for (int i = 0; i < n; i++)
    // {
    //     cout << dp[i][0][0] << ' ' << dp[i][0][1] << ' ' << dp[i][1][0] << ' ' << dp[i][1][1] << ' ' << endl;
    // }

    int ans = min(dp[n - 1][1][0], dp[n - 1][0][0]);
    if (ans == inf)
    {
        cout << -1;
    }
    else
        cout << ans << endl;
}

signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(NULL);
    cout.tie(NULL);
    int t = 1;
    // cin >> t;
    for (int i = 1; i <= t; i++)
    {
        // cout << "Case #" << i << ':' << ' ';
        solve();
        cout << endl;
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...