Problem:
Score : 700 points

Problem Statement

We have a directed weighted graph with N vertices.
Each vertex has two integers written on it, and the integers written on Vertex i are A_i and B_i.

In this graph, there is an edge from Vertex x to Vertex y for all pairs 1 \leq x,y \leq N, and its weight is {\rm min}(A_x,B_y).

We will consider a directed cycle in this graph that visits every vertex exactly once.
Find the minimum total weight of the edges in such a cycle.

Constraints

2 \leq N \leq 10^5

1 \leq A_i \leq 10^9

1 \leq B_i \leq 10^9

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
A_1 B_1
A_2 B_2
:
A_N B_N

Output

Print the minimum total weight of the edges in such a cycle.

Sample Input 1

3
1 5
4 2
6 3

Sample Output 1

7

Consider the cycle 1→3→2→1. The weights of those edges are {\rm min}(A_1,B_3)=1, {\rm min}(A_3,B_2)=2 and {\rm min}(A_2,B_1)=4, for a total of 7.
As there is no cycle with a total weight of less than 7, the answer is 7.

Sample Input 2

4
1 5
2 6
3 7
4 8

Sample Output 2

10

Sample Input 3

6
19 92
64 64
78 48
57 33
73 6
95 73

Sample Output 3

227

Solution in Java8 (OpenJDK 1.8.0) (judge verdict: Accepted)

import java.io.*;
import java.util.*;
 
public class Main {
	static final Reader in = new Reader();
	
	public static void main(String[] args) {
		int n=in.nextInt();
		Pair[] p = new Pair[2*n];
		long[] a = new long[2];
		for(int i=0; i<2*n; ++i) {
			p[i] = new Pair(in.nextInt(), i);
			a[i&1]+=p[i].a;
		}
		a[0]=Math.min(a[1], a[0]);
		a[1]=0;
		Arrays.sort(p, new Comparator<Pair>() {
			public int compare(Pair a, Pair b) {
				return a.a==b.a?a.b-b.b:a.a-b.a;
			}
		});
		int[] q = new int[2*n];
		for(int i=0; i<n; ++i)
			a[1]+=p[i].a;
		for(int i=0; i<2*n; ++i)
			q[p[i].b]=i;
		for(int i=0; i<n; ++i) {
			long c=a[1];
			int j=n;
			while(j-(q[2*i]<j?1:0)-(q[2*i+1]<j?1:0)<n)
				c+=p[j++].a;
			for(int k=2*i; k<2*i+2; ++k)
				if(q[k]<j)
					c-=p[q[k]].a;
			a[0]=Math.min(c, a[0]);
		}
		System.out.println(a[0]);
	}
	
	static class Pair {
		int a, b;
		Pair(int a, int b) {
			this.a=a;
			this.b=b;
		}
	}
	
	static class Reader {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		String next() {
			while(st==null||!st.hasMoreTokens()) {
				try {
					st = new StringTokenizer(br.readLine());
				} catch(Exception e) {}
			}
			return st.nextToken();
		}
		int nextInt() {
			return Integer.parseInt(next());
		}
	}
}