Submission #733250

#TimeUsernameProblemLanguageResultExecution timeMemory
733250tch1cherinGroup Photo (JOI21_ho_t3)C++17
100 / 100
464 ms468 KiB
#include <bits/stdc++.h>
using namespace std;

struct fenwick {
  int N;
  vector<int> F;

  fenwick(int n) : N(n), F(n + 1) {}

  void add(int i, int v) {
    for (i++; i <= N; i += i & -i) {
      F[i] += v;
    }
  }

  int query(int r) {
    int ans = 0;
    for (; r > 0; r -= r & -r) {
      ans += F[r];
    }
    return ans;
  }
};

void solve() {
  int N;
  cin >> N;
  vector<int> H(N);
  for (int &v : H) {
    cin >> v;
    v--;
  }
  vector<int> pos(N);
  for (int i = 0; i < N; i++) {
    pos[H[i]] = i;
  }
  vector<int> p(N);
  fenwick f(N);
  for (int i = 0; i < N; i++) {
    p[i] = i - f.query(pos[i]); 
    f.add(pos[i], 1);
  }
  vector<long long> dp(N + 1);
  for (int i = 0; i < N; i++) {
    fenwick right(N);
    long long I = 0, X = 0;
    dp[i + 1] = LLONG_MAX; 
    for (int l = i; l >= 0; l--) {
      X += p[l] - right.query(pos[l]);  
      I += right.query(pos[l]);
      dp[i + 1] = min(dp[i + 1], dp[l] + min(I, 1ll * (i - l) * (i - l + 1) / 2 - I) + X);
      right.add(pos[l], 1);  
    }
  }
  cout << dp[N] << "\n";
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  solve();
}
#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...