Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

Minimum Cost Sort

You are given $n$ integers $w_i (i = 0, 1, ..., n-1)$ to be sorted in ascending order. You can swap two integers $w_i$ and $w_j$. Each swap operation has a cost, which is the sum of the two integers $w_i + w_j$. You can perform the operations any number of times.

Write a program which reports the minimal total cost to sort the given integers.

Input

In the first line, an integer $n$ is given. In the second line, $n$ integers $w_i (i = 0, 1, 2, ... n-1)$ separated by space characters are given.

Output

Print the minimal cost in a line.

Constraints

$1 \leq n \leq 1,000$

$0 \leq w_i\leq 10^4$

$w_i$ are all different

Sample Input 1

5
1 5 3 4 2

Sample Output 1

7

Sample Input 2

4
4 3 2 1

Sample Output 2

10

Solution in C++ (judge verdict: Time Limit Exceeded)


#include<algorithm>
#include<iostream>
#include<map>
#include<vector>
int main(void) {
	std::ios_base::sync_with_stdio(false);
	int n, input;
	std::cin >> n;
	std::map<int, int>w;
	std::vector<int>vector(n);
	
	for (int i = 0; i < n; ++i) {
		std::cin >> input;
		w[input - 1] = i;
		vector[i] = input-1;
	}
	std::vector<int>vector_min= vector;
	std::map<int, int>w_1(w);
	std::sort(vector_min.begin(), vector_min.end());
	for (int i = 0; i < n; ++i) {
		w[vector[i]] = vector_min[i];
	}
	int cnt = 0;
	for (int i = 0; i < n; ++i) {
		int temp = 0;
		while (vector_min[i] != w[vector_min[i]]) {
			temp += vector_min[i] + w[vector_min[i]] + 2;
			std::swap(w[vector_min[i]],w[w[vector_min[i]]] );
		}
		int temp_1 = 0;
		if (i>0&&vector_min[i] != w_1[vector_min[i]]) {
			temp_1 +=  w_1[vector_min[i]]+ w_1[vector_min[0]] + 2;
			std::swap(w_1[vector_min[0]], w_1[vector_min[i]]);
			while (vector_min[0] !=w_1[vector_min[i]]) {
				temp_1 += w_1[vector_min[i]]+ w_1[vector_min[0]] + 2;
				std::swap(w_1[vector_min[0]], w_1[w_1[vector_min[i]]]); }
		}
		cnt += std::min(temp, temp_1);
	}
	std::cout << cnt << std::endl;
//	system("pause");
	return 0;
}