Submission #538498

#TimeUsernameProblemLanguageResultExecution timeMemory
538498Haruto810198Group Photo (JOI21_ho_t3)C++17
100 / 100
999 ms509808 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long
#define double long double

#define FOR(i, l, r, d) for(int i=(l); i<=(r); i+=(d))
#define szof(x) ((int)(x).size())

#define vi vector<int>
#define pii pair<int, int>

#define F first
#define S second

#define pb push_back
#define eb emplace_back
#define mkp make_pair

const int INF = INT_MAX;
const int LNF = INF*INF;
const int MOD = 1000000007;

//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("unroll-loops")

const int MAX = 5010;

int n;
int arr[MAX][MAX]; // arr[i] = arr. after sorting [1, i]
int pos[MAX][MAX];
int cost[MAX][MAX]; // cost[i][j] = cost to sort [i, j]
int dp[MAX];
int res;

inline int sum(int l, int r){
	return (l + r) * (r - l + 1) / 2;
}

#define lsb(x) ((x)&(-(x)))

int BIT[MAX];

void modify(int pos, int val){
	while(pos < MAX){
		BIT[pos] += val;
		pos += lsb(pos);
	}
}

int query(int pos){
	int ret = 0;
	while(pos > 0){
		ret += BIT[pos];
		pos -= lsb(pos);
	}
	return ret;
}

signed main(){
	
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	
	cin>>n;
	FOR(i, 1, n, 1){
		cin>>arr[0][i];
	}

	FOR(i, 1, n, 1){
		int ptr;
		FOR(j, 1, n, 1){
			arr[i][j] = arr[i-1][j];
			if(arr[i][j] == i) ptr = j;
		}

		while(ptr > i){
			swap(arr[i][ptr-1], arr[i][ptr]);
			ptr--;
		}
	}
	
	FOR(i, 0, n, 1){
		FOR(j, 1, n, 1){
			pos[i][ arr[i][j] ] = j;
		}
	}
	
	FOR(l, 1, n, 1){
		int dpos = 0;
		int inv = 0;
		FOR(r, l, n, 1){
			// cost[l, r]

			dpos += pos[l-1][r] - r;
			inv += query(pos[l-1][r] - 1);
			modify(pos[l-1][r], 1);

			cost[l][r] = dpos + inv;
		}
		
		FOR(r, l, n, 1){
			modify(pos[l-1][r], -1);
		}
	}

	FOR(r, 1, n, 1){
		dp[r] = LNF;
		FOR(l, 1, r, 1){
			dp[r] = min(dp[r], dp[l-1] + cost[l][r]);
		}
	}

	cout<<dp[n]<<'\n';
	/*
	FOR(l, 1, n, 1){
		cerr<<"cost["<<l<<"] : ";
		FOR(r, 1, n, 1){
			cerr<<cost[l][r]<<" ";
		}
		cerr<<endl;
	}
	cerr<<endl;
	*/
	return 0;

}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:73:7: warning: 'ptr' may be used uninitialized in this function [-Wmaybe-uninitialized]
   73 |   int ptr;
      |       ^~~
#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...