제출 #1329554

#제출 시각아이디문제언어결과실행 시간메모리
1329554mhn_neekGroup Photo (JOI21_ho_t3)C++20
100 / 100
866 ms352860 KiB
//In the name of God
#include<bits/stdc++.h>
using namespace std;
typedef long long int lli;
typedef long double ld;
typedef pair<lli,lli> pii;
typedef pair<pii,pii> piiii;
typedef vector<lli> ve;
typedef vector<pii> vp;
const lli N=5100;
const lli mod=1e9+7;//998244353;//1e9+9
const lli INF=1e18;
lli power(lli x,lli y){lli res = 1;x = x % mod;while(y>0){if( y & 1 ){res = (res * x) % mod;}y = y >> 1;x = (x * x)%mod;}return res;}
lli modinv(lli x){return power(x,mod-2);}
lli divide(lli x,lli y){return ((x%mod) * modinv(y))%mod;}
#define all(v) v.begin(),v.end()
#define MIN(v) *min_element(all(v))
#define MAX(v) *max_element(all(v))
#define migmig ios_base::sync_with_stdio(false),cout.tie(0), cin.tie(0);
#define read freopen("input.txt", "r", stdin);freopen("output.txt", "w", stdout);
#define minheap priority_queue<pair<lli,pii>, std::vector<pair<lli,pii>>, std::greater<pair<lli,pii>>>
#define set_preci(x) cout << fixed << setprecision(x);
#define debug(x) cerr << (#x) << " " << (x) << endl
#define MP make_pair
#define PB push_back
#define fi first
#define se second
#define SUM(v) accumulate(v.begin(),v.end(), 0LL)
#define FOR(x,n) for(lli x = 0; x < n; x++)
#define FORS(x,n) for(lli x = 1; x <= n; x++)
#define TEST int TQPWIEJR; cin>>TQPWIEJR;while(TQPWIEJR--)
#define BN(l,a) while(l){a.PB(l%2);l/=2;}
#define lb lower_bound
#define ub upper_bound
#define endl "\n"
#define sep " "
#define SZ(X) (lli)X.size()
lli tmp;
lli dp[N][2];
lli f[N][N],g[N][N];
lli n,A[N];
lli ig[N][N];
struct Fenwick{
    lli fen[N],n;
    void build(){
        FORS(i,n)
            fen[i] = 0;
    }
    lli get(lli i){
        lli ans = 0;
        for(;i > 0; i -= (i&-i))
            ans += fen[i];
        return ans;
    }
    void update(lli i,lli x){
        for(;i <= n; i += (i&-i))
            fen[i] += x;
    }
};
int main(){
    migmig;
    cin>>n;
    FORS(i,n){
        cin>>A[i];
    }
    FOR(i,n+1){
        lli ind = 0;
        FORS(j,n){
            if(A[j] <= i)continue;
            ind ++;
            ig[i][A[j]] = ind;
        }
    }
    Fenwick fen;
    fen.n=n;

    FORS(l,n){
        fen.build();
        for(lli r = l; r <= n; r ++){
            if(l == r){
                fen.update(ig[l-1][r],1);
                f[l][r] = ig[l-1][r]- 1;
                continue;
            }
            lli res = -(fen.get(n) -  fen.get(ig[l-1][r]));
            // for(lli i= l; i < r; i ++){
            //     if(ig[l-1][i] > ig[l-1][r])res --;
            // }
            f[l][r] = f[l][r-1] + res + ig[l-1][r] - 1;
            fen.update(ig[l-1][r],1);
        }
    }

    FORS(l,n){
        fen.build();
        for(lli r = l; r <= n; r ++){
            if(l == r){
                fen.update(ig[l-1][r],1);
                g[l][r] = ig[l-1][r] - 1;
                continue;
            }
            lli res = -fen.get(ig[l-1][r]-1);
            // for(lli i= l; i < r; i ++){
            //     if(ig[l-1][i] < ig[l-1][r])res --;
            // }
            g[l][r] = g[l][r-1] + res + ig[l-1][r] - 1;
            fen.update(ig[l-1][r],1);
        }
    }
    // debug(ig[0][1]);
    // debug(f[1][1]);
    // debug(f[1][3]);
    // debug(g[1][3]);
    FORS(i,n){
        dp[i][0] = dp[i][1] = INF;
        FOR(j,i){
            dp[i][0] = min(dp[j][1] + f[j+1][i],dp[i][0]);
            dp[i][0] = min(dp[j][0] + f[j+1][i],dp[i][0]);
            dp[i][1] = min(dp[j][0] + g[j+1][i],dp[i][1]);
        }
    }
    cout<<min(dp[n][0],dp[n][1])<<endl;

}
#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...