제출 #784775

#제출 시각아이디문제언어결과실행 시간메모리
784775borisAngelovGroup Photo (JOI21_ho_t3)C++17
100 / 100
348 ms588 KiB
#include <bits/stdc++.h> using namespace std; const int maxn = 5005; const int inf = 1e9; int n; int p[maxn]; int pos[maxn]; int dp[maxn]; int tree_original[maxn]; void update_original(int idx, int val) { for (int i = idx; i <= n; i += (i & (-i))) { tree_original[i] += val; } } int query_original(int idx) { int result = 0; for (int i = idx; i >= 1; i -= (i & (-i))) { result += tree_original[i]; } return result; } int tree[maxn]; void reset_tree() { for (int i = 1; i <= n; ++i) { tree[i] = 0; } } void update_tree(int idx, int val) { for (int i = idx; i <= n; i += (i & (-i))) { tree[i] += val; } } int query_tree(int idx) { int result = 0; for (int i = idx; i >= 1; i -= (i & (-i))) { result += tree[i]; } return result; } void fastIO() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); } int main() { fastIO(); cin >> n; for (int i = 1; i <= n; ++i) { cin >> p[i]; pos[p[i]] = i; } dp[n + 1] = 0; for (int i = n; i >= 1; --i) { update_original(pos[i], +1); reset_tree(); dp[i] = 1e9; int cost = 0; for (int j = i; j <= n; ++j) { cost += query_original(pos[j]) - 1; update_tree(pos[j], +1); cost -= (query_tree(n) - query_tree(pos[j])); dp[i] = min(dp[i], dp[j + 1] + cost); } } cout << dp[1] << 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...