Submission #1219338

#TimeUsernameProblemLanguageResultExecution timeMemory
1219338trimkusGroup Photo (JOI21_ho_t3)C++20
64 / 100
5095 ms26384 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const int MAXN = 5000;
int bit1[MAXN + 1], bit2[MAXN + 1];

void update(int* bit, int i, int delta) {
	for (i += 1; i <= MAXN; i += i & -i) {
		bit[i] += delta;
	}
}

int query(int* bit, int r) {
	int res = 0;
	for (r += 1; r > 0; r-= r & -r) {
		res += bit[r];
	}
	return res;
}

int query(int* bit, int l, int r) {
	return query(bit, r) - query(bit, l - 1);
}


int main() {
	int n;
	cin >> n;
	vector<int> a(n + 1), pos(n + 1);
	for (int i = 1; i <= n; ++i) {
		cin >> a[i];
		pos[a[i]] = i;
	}
	vector<int> dp(n + 1, INT_MAX);
	dp[0] = 0;
	for (int i = 1; i <= n; ++i) {
		int inversions = 0;
		for (int j = 0; j <= MAXN; ++j) {
			bit1[j] = bit2[j] = 0;
		}
		for (int j = 1; j <= i; ++j) {
			inversions += query(bit1, 1, pos[j]);
			update(bit1, pos[j], +1);
		}
		
		for (int j = 0; j < i; ++j) {
			cerr << i << " , " << j << " = " << inversions << "\n";
			dp[i] = min(dp[i], dp[j] + inversions);
			inversions -= query(bit1, pos[j + 1] + 1, n) 
			+ query(bit2, pos[j + 1] + 1, n);
			update(bit1, pos[j + 1], -1);
			inversions += query(bit1, 1, pos[j + 1]);
			update(bit2, pos[j + 1], +1);
		}
	}
	cout << dp[n] << "\n";
}
#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...