제출 #412992

#제출 시각아이디문제언어결과실행 시간메모리
412992joseacazGroup Photo (JOI21_ho_t3)C++17
100 / 100
676 ms67648 KiB
#include <bits/stdc++.h>
 
using namespace std;
 
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<pii> vpi;
typedef vector<pll> vpl;
 
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
#define pb push_back

const int MAXN = 5005;
int N, a[MAXN], pos[MAXN], DP[MAXN], pre[MAXN][MAXN];
int BIT_u[MAXN], BIT_p[MAXN];

void upd_u(int _pos)
{
	for(; _pos <= N; _pos += _pos&-_pos)
		BIT_u[_pos]++;
}

void upd_p(int _pos)
{
	for(; _pos <= N; _pos += _pos&-_pos)
		BIT_p[_pos]++;
}

int qry_u(int _pos)
{
	int res = 0;
	for(; _pos; _pos -= _pos&-_pos)
		res += BIT_u[_pos];
	return res;
}

int qry_p(int _pos)
{
	int res = 0;
	for(; _pos; _pos -= _pos&-_pos)
		res += BIT_p[_pos];
	return res;
}

int main()
{
	cin >> N;
	for(int i = 1; i <= N; i++)
	{
		cin >> a[i];
		pos[a[i]] = i;
	}
	
	for(int i = 1; i <= N; i++)
	{
		for(int j = 1; j <= N; j++)
			BIT_p[j] = 0;
			
		pre[i][i] = qry_u(N) - qry_u(pos[i]);
		upd_p(pos[i]);
		for(int j = i + 1; j <= N; j++)
		{
			pre[i][j] = pre[i][j - 1] + qry_p(pos[j]) + qry_u(N) - qry_u(pos[j]);
			upd_p(pos[j]);
		}
		
		upd_u(pos[i]);
	}
	
	DP[1] = 0;
	for(int l = 2; l <= N; l++)
	{
		DP[l] = (1 << 30);
		for(int j = l; j >= 1; j--)
			DP[l] = min(DP[l], pre[j][l] + DP[j - 1]);
	}
	
	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...