Submission #398609

#TimeUsernameProblemLanguageResultExecution timeMemory
398609AmineWeslatiGroup Photo (JOI21_ho_t3)C++17
100 / 100
681 ms117756 KiB
#include <bits/stdc++.h>
using namespace std; 
	
typedef long long ll;
typedef vector<int>vi;
#define pb push_back
#define sz(v) (int)v.size()
#define FOR(i,a,b) for(int i=a; i<b; i++)
#define ROF(i,a,b) for(int i=b-1; i>=a; i--)

void ckmin(ll &x, ll y){x=min(x,y);}

void IO(){
#ifdef LOCAL
	freopen("input.txt","r",stdin);
	freopen("output.txt","w",stdout);
#endif
}
//--------------------------------------------------------------------

const int MX=5e3+10;
int N;
ll val[MX][MX]; 
vi a(MX);

vi t; 
void upd(int i){
	for(;i<sz(t); i+=i&-i) t[i]++;
}
int get(int i){
	int ans=0;
	for(;i;i-=i&-i) ans+=t[i];
	return ans; 
}

void compute(){
	FOR(l,1,N+1){
		vi b;
		FOR(i,1,N+1) if(a[i]>=l) b.pb(a[i]);
		int n=sz(b);

		vi order(N+1),nb(N+1,0);
		t.assign(N+1,0);
		ROF(i,0,n){
			order[b[i]]=i;
			nb[b[i]]=get(b[i]);
			upd(b[i]);
		}

		val[l][l]=order[l];
		FOR(r,l+1,N+1)
			val[l][r]=val[l][r-1]+order[r]-nb[r];
	}
}

int main(){
	IO();

	cin>>N;
	FOR(i,1,N+1) cin>>a[i];


	compute();
	
	ll dp[N+1];
	dp[0]=0;
	FOR(i,1,N+1){
		dp[i]=1e18;
		FOR(j,0,i) ckmin(dp[i],dp[j]+val[j+1][i]);
	}
	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...