#include <bits/stdc++.h>
using namespace std;
int n;
int const NMAX=5005;
int v[NMAX];
int pos[NMAX];
void read(){
cin>>n;
int i;
for(i=1;i<=n;++i){
cin>>v[i];
pos[v[i]]=i;
}
}
int ub(int x){
return x&(-x);
}
struct fenwick_tree{
int v[NMAX];
void add(int pos,int val){
while(pos<=n){
v[pos]+=val;
pos+=ub(pos);
}
}
int sum(int pos){
int s=0;
while(pos){
s+=v[pos];
pos-=ub(pos);
}
return s;
}
void _clear(){
int i;
for(i=1;i<=n;++i)
v[i]=0;
}
int sum_range(int l,int r){
return sum(r)-sum(l-1);
}
}aib[2];
int dp[NMAX];
int const INF=1e9;
void minself(int& x,int val){
if(x>val)
x=val;
}
int solve(){
dp[0]=0;
int i,j;
for(i=1;i<=n;++i)
dp[i]=INF;
for(i=0;i<n;++i){
aib[1]._clear();
int total=0;
for(j=i+1;j<=n;++j){
total+=pos[j]-1-aib[0].sum(pos[j]-1)-aib[1].sum_range(pos[j]+1,n);
minself(dp[j],dp[i]+total);
aib[1].add(pos[j],1);
}
aib[0].add(pos[i+1],1);
}
return dp[n];
}
int main()
{
read();
cout<<solve();
return 0;
}
# | 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... |