제출 #1328041

#제출 시각아이디문제언어결과실행 시간메모리
1328041joacruGroup Photo (JOI21_ho_t3)C++20
100 / 100
2689 ms616 KiB
#include <iostream>
#include <assert.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>

#define forn(i,n) for(int i=0;i<(int)n;++i)
#define fort(i,n) for(int i=0;i<=(int)n;++i)
#define fori(i,a,n) for(int i=a;i<(int)n;++i)
#define forit(i,a,n) for(int i=a;i<=(int)n;++i)

#define DBG(a) cerr<<#a<<" = "<<(a)<<endl
#define DBGA(a) cerr<<#a<<" = "<<(a)<<", ";
#define DBG2(a,b) do{DBGA(a)DBG(b);}while(0)
#define DBG3(a,b,c) do{DBGA(a)DBGA(b)DBG(c);}while(0)
#define DBG4(a,b,c,d) do{DBGA(a)DBGA(b)DBGA(c)DBG(d);}while(0)

#define ALL(v) v.begin(),v.end()
#define SZ(v) (int)v.size()

using namespace std;

template<typename T>
ostream &operator<<(ostream &os, vector<T> v){
	os<<"[";
	forn(i,SZ(v)){
		if(i) os<<", ";
		os<<v[i];
	}
	os<<"]";
	return os;
}

template<typename T>
using PQ = priority_queue<T>;

typedef long long ll;

const int INF = 1000000000;

struct ST{
	int n;
	vector<int> st;
	ST(int _n){
		n=1<<(32-__builtin_clz(_n-1));
		st.resize(2*n+1);
	}
	void update(int i){
		i+=n-1;
		st[i] += 1;
		while(i){
			i=(i-1)/2;
			st[i]=st[2*i+1]+st[2*i+2];
		}
	}
	int query(int ql, int qr, int l, int r, int i){
		if(l>=qr||r<=ql) return 0;
		if(l>=ql&&r<=qr) return st[i];
		int m=(l+r)/2;
		return query(ql,qr,l,m,2*i+1)+query(ql,qr,m,r,2*i+2);
	}
	int query(int l, int r){
		return query(l,r,0,n,0);
	}
};

void solve(){
	
	int n;
	cin>>n;
	vector<int> a(n), p(n);
	forn(i,n){
		cin>>a[i];
		p[--a[i]] = i;
	}
	
	vector<int> dp(n+1,INF);
	dp[0] = 0;
	
	forn(x,n){ // hay x elementos colocados, hay que colocar el elemento x
		//~ DBG2(x, dp[x]);
		int cnt = dp[x];
		ST photo(n);
		ST stand(n);
		forn(i,x) stand.update(p[i]);
		for(int i=x;i<n;++i){ // quiero colocar a x en la posicion i
			cnt += p[i]-stand.query(0,p[i]);
			cnt -= photo.query(p[i],n);
			//~ DBG3(i,dp[x],cnt);
			dp[i+1] = min(dp[i+1],cnt);
			photo.update(p[i]);
		}
	}
	
	cout<<dp[n]<<"\n";
	
}

int main(){
	
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	
	#ifdef LOCAL
	freopen("C.in", "r", stdin);
	int tcs;
	cin>>tcs;
	while(tcs--)
	#endif
	solve();
	
	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...