Submission #380256

#TimeUsernameProblemLanguageResultExecution timeMemory
380256peijarGroup Photo (JOI21_ho_t3)C++17
100 / 100
809 ms756 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);
	Fenwick fen2(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)
	{
		int coutPlacement = dp[dejaPlace];
		for (int placeApres(1); placeApres + dejaPlace <= nbElem; ++placeApres)
		{
			int iPos = placeApres + dejaPlace - 1;
			coutPlacement += fen.sum(positions[iPos]);
			coutPlacement -= fen2.sum(positions[iPos]+1, nbElem);
			fen2.update(positions[iPos], 1);


			/*for (int iPos = dejaPlace + placeApres-1; iPos >= dejaPlace; --iPos) 
			{
				coutPlacement += fen.sum(positions[iPos]);
				fen.update(positions[iPos], -1);
			}
			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);
		}
		for (int placeApres(1); placeApres + dejaPlace <= nbElem; ++placeApres)
			fen2.update(positions[placeApres+dejaPlace-1], -1);
		fen.update(positions[dejaPlace], -1);
	}
	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...