Submission #379801

#TimeUsernameProblemLanguageResultExecution timeMemory
379801TeaTimeGroup Photo (JOI21_ho_t3)C++17
100 / 100
635 ms118892 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <bitset>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <ctime>
#include <queue>
 
using namespace std;
 
typedef long long ll;
typedef long double ld;
#define fastInp cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0);
 
const ll  MOD = 1e9 + 7, MX2 = 1e6, SZ = 5030, INF = 1e9;
 
ll n;
vector<ll> vec;
 
ll dp[SZ];
ll invs[SZ][SZ];
 
signed main() {
    fastInp;
 
    cin >> n;
    vec.resize(n);
 
    for (auto& c : vec) cin >> c;
 
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            if (vec[i] > vec[j]) {
                invs[vec[j]][vec[i]]++;
            }
        }
    }
 
    for (int i = 1; i <= n; i++) dp[i] = INF;
 
    for (int i = 1; i < SZ; i++) {
        for (int l = 0; l < SZ; l++) {
            ll r = i + l;
            if (r >= SZ) continue;
 
            invs[l][r] += invs[l][r - 1] + invs[l + 1][r] - invs[l + 1][r - 1];
        }
    }
 
   /* for (int k = 1; k <= n; k++) {
        ll l = (k);
        ll cst = (invs[0][n] - invs[k + 1][n] - invs[0][k]) + (l * (l - 1) / 2 - invs[0][k]);
        dp[k] = min(dp[k], dp[0] + cst);
    }*/
 
    for (int i = 1; i <= n; i++) {
        ll k = 0, ind = 0;
        for (int j = 0; j < n; j++) {
            if (vec[j] == i) ind = j;
        }
 
        for (int j = 0; j < ind; j++) {
            if (vec[j] > i) k++;
        }
 
        dp[i] = min(dp[i], dp[i - 1] + k);
 
        for (int k = i + 1; k <= n; k++) {
            ll l = (k - i + 1);
            ll cst = (invs[i][n] - invs[k + 1][n] - invs[i][k]) + (l * (l - 1) / 2 - invs[i][k]);
            dp[k] = min(dp[k], dp[i - 1] + cst);
            if (dp[n] == 3) {
                cout << "";
            }
        }
    }
 
    cout << dp[n];
 
    return 0;
}
 
/*
9 12
1 2
4 2
5 8
4 6
6 9
2 9
8 7
8 3
7 1
9 4
3 5
3 4
 
3 4
2 1
2 3
3 1
1 3
*/
#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...