제출 #1221189

#제출 시각아이디문제언어결과실행 시간메모리
1221189AlgorithmWarriorGroup Photo (JOI21_ho_t3)C++20
100 / 100
286 ms516 KiB
#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 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...