Submission #759230

#TimeUsernameProblemLanguageResultExecution timeMemory
7592301075508020060209tcGroup Photo (JOI21_ho_t3)C++14
100 / 100
386 ms516 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
int lowbit(int x){return x&-x;}
int bit[200005];

void upd(int pl,int val){
while(pl<=5000){
    bit[pl]+=val;
    pl+=lowbit(pl);
}
}
int qsum(int pl){
int ret=0;
while(pl){
    ret+=bit[pl];
    pl-=lowbit(pl);
}
return ret;
}



int n;
int ar[5010];
int rar[5010];
int dp[5010];
int ps[5010];

signed main(){
cin>>n;
for(int i=1;i<=n;i++){
    cin>>ar[i];
    rar[ar[i]]=i;
    dp[i]=1e16;
}

dp[0]=0;
for(int i=1;i<=n;i++){
    int cal=0;
    for(int a=1;a<=5000;a++){
        bit[a]=0;
        ps[a]=ps[a-1];
        if(ar[a]>i){ps[a]++;}
    }
 //   for(int a=1;a<=i;a++){
   //     upd(rar[a],1);
    //}


    for(int j=i-1;j>=0;j--){


/*
        for(int a=1;a<=n;a++){
            if(ar[a]>j&&ar[a]<=i){
                //for(int b=1;b<a;b++){
                  //  if((ar[b]<ar[a]&&ar[b]>j)||(ar[b]>i) ){cal++;}
                //}
                cal+=qsum(ar[a]);
            }
            if(ar[a]>j&&ar[a]<=i){
                upd(ar[a],1);
            }
            if(ar[a]>i){
                upd(1,1);
            }
        }
*/
        cal+=ps[rar[j+1]];
        upd(rar[j+1],1);
        cal+=qsum(5000)-qsum(rar[j+1]);

        dp[i]=min(dp[i],cal+dp[j]);
    }
   // cout<<dp[i]<<" ";
}
cout<<dp[n]<<endl;




}
/*
6 5
1 2 1 100000
1 3 1 1
2 6 1 1000
2 4 1 1
2 5 1 1
*/
#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...