Submission #380252

#TimeUsernameProblemLanguageResultExecution timeMemory
380252peijarGroup Photo (JOI21_ho_t3)C++17
44 / 100
5050 ms492 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;

struct Fenwick
{
	int N;
	vector<int> BIT;
	
	Fenwick(int n) : N(n+1), BIT(N) {}

	void update(int iPos, int delta)
	{
		for (iPos++; iPos < N; iPos += iPos & -iPos)
			BIT[iPos] += delta;
	}

	int sum(int r) // sum < r
	{
		int sol(0);
		for (; r; r -= r * -r)
			sol += BIT[r];
		return sol;
	}

	int sum(int l, int r) // l <= i < r
	{
		return sum(r) - sum(l);
	}
};

signed main(void)
{
	ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	
	int nbElem;
	cin >> nbElem;
	vector<int> hauteurs(nbElem);
	vector<int> positions(nbElem);
	for (int iPos = 0; iPos < nbElem; ++iPos) 
	{
		cin >> hauteurs[iPos];
		--hauteurs[iPos];
		positions[hauteurs[iPos]] = iPos;
	}
	
	Fenwick fen(nbElem+1);
	for (int iPos = 0; iPos < nbElem; ++iPos) 
		fen.update(iPos, 1);
	vector<int> dp(nbElem+1, 1e18);
	dp[0] = 0; 
	for (int dejaPlace(0); dejaPlace < nbElem; ++dejaPlace)
	{
		for (int placeApres(1); placeApres + dejaPlace <= nbElem; ++placeApres)
		{
			int coutPlacement = dp[dejaPlace];
			for (int iPos = dejaPlace; iPos < dejaPlace+placeApres; ++iPos) 
				for (int j(0); j < positions[iPos]; ++j)
					if (hauteurs[j] >= dejaPlace and (hauteurs[j] >= dejaPlace + placeApres or hauteurs[j] < iPos))
						++coutPlacement;
			dp[dejaPlace+placeApres] = min(dp[dejaPlace+placeApres], coutPlacement);
		}
	}
	cout << dp[nbElem] << 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...