Submission #1125665

#TimeUsernameProblemLanguageResultExecution timeMemory
1125665Kel_MahmutGroup Photo (JOI21_ho_t3)C++20
100 / 100
4599 ms196652 KiB
#include <bits/stdc++.h>
#define pb push_back
#define endl ("\n")
#define all(aa) aa.begin(), aa.end()
typedef long long ll;
using namespace std;

struct SegmentTree{
	int n;
	vector<int> t;
	SegmentTree(int n) : n(n), t(4 * n){}
	void upd(int u, int tl, int tr, int pos, int val){
		if(tl == tr){
			t[u] = val;
			return;
		}
		int tm = (tl + tr) / 2;
		if(pos <= tm)
			upd(u * 2, tl, tm, pos, val);
		else
			upd(u * 2 + 1, tm + 1, tr, pos, val);
		t[u] = t[u * 2] + t[u * 2 + 1];
	}

	void upd(int pos, int val){
		upd(1, 0, n - 1, pos, val);
	}

	int query(int u, int tl, int tr, int ql, int qr){
		if(ql <= tl && tr <= qr){
			return t[u];
		}
		int tm = (tl + tr) / 2;
		int ret = 0;
		if(ql <= tm)
			ret += query(u * 2, tl, tm, ql, qr);
		if(tm < qr)
			ret += query(u * 2 + 1, tm + 1, tr, ql, qr);
		return ret;
	}

	int query(int ql, int qr){
		return query(1, 0, n - 1, ql, qr);
	}
};

int main(){
	int n;
	cin >> n;
	vector<int> a(n);
	for(int i = 0; i < n; i++) cin >> a[i], a[i]--;
	vector<int> pos(n);
	for(int i = 0; i < n; i++) pos[a[i]] = i;
	vector<vector<int>> inv(n, vector<int>(n));
	for(int r = n - 1; r >= 0; r--){
		SegmentTree st(n);
		int cur = 0;
		for(int l = r; l >= 0; l--){
			cur += st.query(pos[l], n - 1);
			inv[l][r] = cur;
			st.upd(pos[l], 1);
		}
	}

	vector<vector<int>> cros(n + 1, vector<int>(n + 1));
	for(int l = 0; l <= n; l++){
		SegmentTree st(n);
		for(int i = 1; i <= l; i++){
			st.upd(pos[i - 1], 1);
		}
		int cur = 0;
		for(int r = l + 1; r <= n; r++){
			cur += st.query(pos[r - 1], n - 1);
			cros[l][r] = cur;
		}
	}

	vector<int> dp(n + 1);
	for(int k = 1; k <= n; k++){
		dp[k] = INT_MAX;
		for(int j = 0; j < k; j++){
			dp[k] = min(dp[k], dp[j] + inv[j][k - 1] + cros[j][k]);
		}
	}
	cout << dp[n] << endl;
}

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