제출 #1329586

#제출 시각아이디문제언어결과실행 시간메모리
1329586itsKiaRashGroup Photo (JOI21_ho_t3)C++20
100 / 100
1190 ms626452 KiB
#include <bits/stdc++.h>
using namespace std;
// #include <ext/pb_ds/tree_policy.hpp>
// #include <ext/pb_ds/assoc_container.hpp>
// using namespace __gnu_pbds; // find_by_order   order_of_key
// template<class T> using oset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
typedef long long ll;
typedef long double ld;
// #pragma GCC optimize ("O2,unroll-loops")
// #pragma GCC optimize ("Ofast")
// #pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt")
#define int ll
#define FAST_IO ios_base::sync_with_stdio(false), cin.tie(NULL);
#define file_init freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);
#define testc int ttt;cin>>ttt;while(ttt--)
#define alll(x)	(x).begin(),(x).end()
#define pqi priority_queue<pii, vector<pii>, greater<pii>>
#define kill(x)  cout << x << '\n', exit(0)
#define rep(x) cerr<<"report: "<<x<<endl;
#define endl '\n'
#define pb push_back
#define ins insert
#define pii pair<int, int>
#define ff first
#define ss second
#define bg begin
#define rbg rbegin
#define sz size()
#define mset(x,y) memset(x,y,sizeof(x))
#define clr clear()
#define YES cout<<"YES"<<endl
#define NO cout<<"NO"<<endl
#define vci vector<int>
#define sti set<int>
#define nl cout<<endl
#define upb upper_bound
#define lrb lower_bound
//ll pw(ll a,ll b){ll res=1;while(b){if(b&1)res=res*a%mod;a=a*a%mod;b>>=1;}return res;}
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
ll gcd(ll a, ll b) { if (b == 0) return a; return gcd(b, a % b);}
ll lcm(ll a, ll b) { return (a * b) / gcd(a, b); }
const ll inf = (ll)1e12 + 18;
const int maxn = 5e3 + 7, mod = 1e9 + 7; //998244353 1594778359 1540481779
int n;
int a[maxn], plc[maxn], dp[maxn];
int inv[maxn][maxn], cst[maxn][maxn];
struct kir{
    int lx = 0, rx = 0;
} cnt[maxn][maxn];
int f(int l, int r, int x){
    if(l > r) return 0;
    int res = x;
    res -= cnt[x][l].rx;
    res -= cnt[x][r].lx;
    return res;
}

int32_t main(){
    FAST_IO
    cin >> n ;
    for(int i = 1 ; i <= n ; i ++) {cin >> a[i]; plc[a[i]] = i;}
    for(int i = 1 ; i <= n ; i ++){
        for(int j = 1 ; j <= n ; j ++) cnt[i][j] = cnt[i - 1][j];
        for(int j = 1 ; j <= n ; j ++){
            if(a[i] > j) cnt[i][j].lx ++;
            if(a[i] < j) cnt[i][j].rx ++;
        }
    }
    for(int i = 1 ; i <= n ; i ++){
        inv[i][i] = 0;
        for(int j = i + 1 ; j <= n ; j ++){
            inv[i][j] = inv[i][j - 1] + f(i, j - 1, plc[j]);
        }
    }
    for(int i = n ; i >= 1 ; i --){
        cst[i][i] = f(i + 1, n, plc[i]);
        for(int j = i ; j >= 1 ; j --){
            cst[j][i] = cst[j + 1][i] + f(i + 1, n, plc[j]);
        }
    }
    dp[0] = 0;
    for(int i = 1 ; i <= n ; i ++){
        dp[i] = inf;
        for(int j = i - 1 ; j >= 0 ; j --){
            dp[i] = min(dp[i], dp[j] + cst[j + 1][i] + inv[j + 1][i]);
        }
    }
    cout << dp[n] << endl;

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