Submission #439636

#TimeUsernameProblemLanguageResultExecution timeMemory
439636JovanBGroup Photo (JOI21_ho_t3)C++17
100 / 100
691 ms67532 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using ld = long double; const int MAXN = 5000; int mns[MAXN+5][MAXN+5]; int dp[MAXN+5]; int a[MAXN+5]; int pos[MAXN+5]; struct BIT{ int n; int bit[MAXN+5]; void add(int x){ while(x <= n){ bit[x]++; x += x & -x; } } int get(int x){ int res = 0; while(x){ res += bit[x]; x -= x & -x; } return res; } }; int main(){ ios_base::sync_with_stdio(false), cin.tie(0); cout.precision(10); cout << fixed; int n; cin >> n; BIT bitpre; bitpre.n = n; for(int i=1; i<=n; i++){ cin >> a[i]; pos[a[i]] = i; } for(int l=1; l<=n; l++){ BIT bit; bit.n = n; for(int i=1; i<=n; i++) bit.bit[i] = 0; for(int r=l; r<=n; r++){ mns[l][r] = mns[l][r-1]; mns[l][r] += bitpre.get(n) - bitpre.get(pos[r]); mns[l][r] += bit.get(pos[r] - 1); bit.add(pos[r]); } bitpre.add(pos[l]); } for(int i=1; i<=n; i++){ dp[i] = n*n; for(int j=i; j>=1; j--){ dp[i] = min(dp[i], dp[j-1] + mns[j][i]); } } cout << dp[n] << "\n"; 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...