Submission #637634

#TimeUsernameProblemLanguageResultExecution timeMemory
637634danikoynovGroup Photo (JOI21_ho_t3)C++14
100 / 100
639 ms196636 KiB
/**
 ____ ____ ____ ____ ____ ____
||l |||e |||i |||n |||a |||d ||
||__|||__|||__|||__|||__|||__||
|/__\|/__\|/__\|/__\|/__\|/__\|

**/

#include<bits/stdc++.h>
#define endl '\n'

using namespace std;
typedef long long ll;

void speed()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
}

const int maxn = 5010;

int n, a[maxn], dp[maxn], pos[maxn], cnt[maxn][maxn], par[maxn][maxn];
void solve()
{
    cin >> n;
    for (int i = 1; i <= n; i ++)
    {
        cin >> a[i];
        pos[a[i]] = i;
    }

    for (int i = 1; i <= n; i ++)
        for (int j = 1; j <= n; j ++)

    {
        cnt[i][j] = cnt[i - 1][j] + cnt[i][j - 1] - cnt[i - 1][j - 1];
        if (pos[i] == j)
            cnt[i][j] ++;
    }

    for (int i = 1; i <= n; i ++)
        for (int j = 1; j <= n; j ++)
        par[i][j] = par[i][j - 1] + cnt[i][pos[j]];

    /**for (int i = 1; i <= n; i ++, cout << endl)
        for (int j = 1; j <= n; j ++)
        cout << cnt[i][j] << " ";*/
    for (int i = 1; i <= n; i ++)
    {
        dp[i] = n * n;

        int all = 0;
        for (int k = i; k > 0; k --)
            all += (cnt[n][pos[k]] - cnt[i][pos[k]]) + cnt[k - 1][pos[k]];
        for (int j = 0; j < i; j ++)
        {
            if (j > 0)
                all -= ((cnt[n][pos[j]] - cnt[i][pos[j]]) + cnt[j - 1][pos[j]]);
            int sum =  - (par[j][i] - par[j][j]);
            /**for (int k = i; k > j; k --)
            {
                ///ll cur = pos[k] + (j + (i - k) - query(pos[k] - 1));
                ll cur = - cnt[j][pos[k]];

                ///cout << i << " : " << j << " : " << k << " " << cnt[n][pos[k]] << " " << cnt[k][pos[k]] << endl;
                //cur -= st;
                //st ++;
                sum = sum + cur;
            }*/

            ///cout << i << " " << j << " " << sum << endl;
            dp[i] = min(dp[i], dp[j] + sum + all);

        }

        ///cout << i << " -- " << dp[i] << endl;

    }
    cout << dp[n] << endl;

}

int main()
{
    solve();
    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...