Submission #784775

#TimeUsernameProblemLanguageResultExecution timeMemory
784775borisAngelovGroup Photo (JOI21_ho_t3)C++17
100 / 100
348 ms588 KiB
#include <bits/stdc++.h>

using namespace std;

const int maxn = 5005;
const int inf = 1e9;

int n;

int p[maxn];
int pos[maxn];

int dp[maxn];

int tree_original[maxn];

void update_original(int idx, int val)
{
    for (int i = idx; i <= n; i += (i & (-i)))
    {
        tree_original[i] += val;
    }
}

int query_original(int idx)
{
    int result = 0;

    for (int i = idx; i >= 1; i -= (i & (-i)))
    {
        result += tree_original[i];
    }

    return result;
}

int tree[maxn];

void reset_tree()
{
    for (int i = 1; i <= n; ++i)
    {
        tree[i] = 0;
    }
}

void update_tree(int idx, int val)
{
    for (int i = idx; i <= n; i += (i & (-i)))
    {
        tree[i] += val;
    }
}

int query_tree(int idx)
{
    int result = 0;

    for (int i = idx; i >= 1; i -= (i & (-i)))
    {
        result += tree[i];
    }

    return result;
}

void fastIO()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
}

int main()
{
    fastIO();

    cin >> n;

    for (int i = 1; i <= n; ++i)
    {
        cin >> p[i];
        pos[p[i]] = i;
    }

    dp[n + 1] = 0;

    for (int i = n; i >= 1; --i)
    {
        update_original(pos[i], +1);
        reset_tree();

        dp[i] = 1e9;

        int cost = 0;

        for (int j = i; j <= n; ++j)
        {
            cost += query_original(pos[j]) - 1;

            update_tree(pos[j], +1);

            cost -= (query_tree(n) - query_tree(pos[j]));

            dp[i] = min(dp[i], dp[j + 1] + cost);
        }
    }

    cout << dp[1] << 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...