#include <bits/stdc++.h>
using namespace std;
// #define int long long
#define FOR(i,a,b) for (int i = (a); i < (b); ++i)
#define pb push_back
#define all(a) a.begin(), a.end()
#define endl "\n"
void printVector(vector<int> a){
for (auto x: a) cout << x << " ";
cout << endl;
}
struct Fenwick{
vector<int> tree; int N;
Fenwick(int n){
tree.resize(n+1);
this->N = n;
}
void add(int k, int x){
while (k <= N){
tree[k] += x;
k += k&-k;
}
}
int sum(int k){
int ans = 0;
while (k >= 1){
ans += tree[k];
k -= k&-k;
}
return ans;
}
int query(int l, int r){
int ans = sum(r);
if (l > 1) ans -= sum(l-1);
return ans;
}
};
void solve(){
int n; cin >> n;
vector<int> a(n+1);
FOR(i,1,n+1) cin >> a[i];
vector<int> ind(n+1);
FOR(i,1,n+1) ind[a[i]] = i;
vector<int> dp(n+1, 1e9);
// printVector(ind);
Fenwick o(n+1);
vector<int> prefix(n+1);
FOR(i,1,n+1){
prefix[i] = o.query(ind[i], n+1);
o.add(ind[i], 1);
}
dp[0] = 0;
dp[1] = 0;
for (int i = 2; i <= n; i++){
Fenwick inv(n+1);
int inversions = 0;
int e = 0;
for (int j = i-1; j >= 0; j--){
e -= inv.sum(ind[j+1]);
e += inv.query(ind[j+1], n+1);
e += prefix[j+1];
inv.add(ind[j+1], 1);
dp[i] = min(dp[i], dp[j]+e);
}
}
// printVector(dp);
cout << dp[n] << endl;
}
int32_t main(){
ios::sync_with_stdio(false);cin.tie(nullptr);
int t = 1; // cin >> t;
while (t--) solve();
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |