제출 #1351014

#제출 시각아이디문제언어결과실행 시간메모리
1351014WarinchaiGroup Photo (JOI21_ho_t3)C++20
100 / 100
343 ms313452 KiB
#include<bits/stdc++.h>
#define int long long
using namespace std;

int a[5005];
int pre[5005][5005];
int cost[5005][5005];
int pos[5005];
int dp[5005];
int inf=1e15;

int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n;cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i],pre[a[i]][i]++,pos[a[i]]=i;
    for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)pre[i][j]=pre[i][j]+pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1];
    /*for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cerr<<pre[i][j]<<" ";
        }
        cerr<<"\n";
    }*/
    for(int i=n;i>=1;i--)for(int j=i;j<=n;j++){
        cost[i][j]=cost[i+1][j];
        //inv >j , i
        cost[i][j]+=pre[n][pos[i]-1]-pre[j][pos[i]-1];
        if(i!=j){
            //inv i, >i & <=j 
            cost[i][j]+=pre[j][n]-pre[i][n]-pre[j][pos[i]]+pre[i][pos[i]];
        }
    }
    /*cerr<<"\n";
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cerr<<cost[i][j]<<" ";
        }
        cerr<<"\n";
    }*/
    for(int i=1;i<=n;i++)dp[i]=inf;
    for(int i=1;i<=n;i++)for(int j=1;j<=i;j++){
        dp[i]=min(dp[i],dp[j-1]+cost[j][i]);
    }
    /*cerr<<"\n";
    for(int i=1;i<=n;i++)cerr<<dp[i]<<" ";
    cerr<<"\n";*/
    cout<<dp[n];
}
#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...