#include<bits/stdc++.h>
typedef long long ll;
#define pb push_back
#define fr first
#define sc second
using namespace std;
const ll inf=1000000000;
struct Fen{
int n;
int sum=0;
vector<int>tree;
void init(int N){
n=N;
sum=0;
tree.resize(n+1,0);
}
void update(int tar,int x){
sum+=x;
while(tar<=n){
tree[tar]+=x;
tar+=(tar&-tar);
}
}
int query(int tar){
int res=0;
while(tar){
res+=tree[tar];
tar-=(tar&-tar);
}
return res;
}
};
int n;
int arr[5023],loc[5023];
ll dp[5023][5023];
Fen fen;
int pref[5023];
int main(){
ios_base::sync_with_stdio(false);cin.tie(NULL);
cin>>n;
fen.init(n);
for(int i=1;i<=n;i++){
cin>>arr[i];
loc[arr[i]]=i;
}
for(int i=1;i<=n+1;i++){
for(int j=0;j<=n;j++){
dp[i][j]=inf;
}
}
dp[1][0]=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
pref[j]=pref[j-1]+(arr[j]>i);
}
ll cos=0;
for(int j=i-1;j>=0;j--){
cos+=fen.sum-fen.query(loc[j+1]);
fen.update(loc[j+1],1);
cos+=pref[loc[j+1]];
dp[i+1][i]=min(dp[i+1][i],dp[i][j]+cos);
dp[i+1][j]=min(dp[i+1][j],dp[i][j]);
}
fen.tree.clear();
fen.init(n);
}
cout<<dp[n+1][n];
}
# | 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... |