← Home
```go
package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
	"strconv"
)

type LevelInfo struct {
	minX int64
	minY int64
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)
	
	n := readInt(scanner)
	
	levels := make(map[int64]*LevelInfo)
	
	for i := 0; i < n; i++ {
		x := readInt64(scanner)
		y := readInt64(scanner)
		k := max(x, y)
		
		if info, ok := levels[k]; ok {
			if x < info.minX {
				info.minX = x
			}
			if y < info.minY {
				info.minY = y
			}
		} else {
			levels[k] = &LevelInfo{
				minX: x,
				minY: y,
			}
		}
	}
	
	keys := make([]int64, 0, len(levels))
	for k := range levels {
		keys = append(keys, k)
	}
	sort.Slice(keys, func(i, j int) bool { return keys[i] < keys[j] })
	
	type Point struct {
		x, y int64
	}
	
	abs := func(a int64) int64 {
		if a < 0 {
			return -a
		}
		return a
	}
	
	dist := func(p1, p2 Point) int64 {
		return abs(p1.x-p2.x) + abs(p1.y-p2.y)
	}
	
	var dp0, dp1 int64
	var prevL, prevB Point
	
	k := keys[0]
	info := levels[k]
	L := Point{info.minX, k}
	B := Point{k, info.minY}
	length := (k - info.minX) + (k - info.minY)
	
	start := Point{0, 0}
	dp0 = dist(start, B) + length
	dp1 = dist(start, L) + length
	prevL, prevB = L, B
	
	for i := 1; i < len(keys); i++ {
		k = keys[i]
		info = levels[k]
		L = Point{info.minX, k}
		B = Point{k, info.minY}
		length = (k - info.minX) + (k - info.minY)
		
		newDp0 := min(dp0+dist(prevL, B), dp1+dist(prevB, B)) + length
		newDp1 := min(dp0+dist(prevL, L), dp1+dist(prevB, L)) + length
		
		dp0, dp1 = newDp0, newDp1
		prevL, prevB = L, B
	}
	
	fmt.Println(min(dp0, dp1))
}

func readInt(scanner *bufio.Scanner) int {
	scanner.Scan()
	n, _ := strconv.Atoi(scanner.Text())
	return n
}

func readInt64(scanner *bufio.Scanner) int64 {
	scanner.Scan()
	n, _ := strconv.ParseInt(scanner.Text(), 10, 64)
	return n
}

func max(a, b int64) int64 {
	if a > b {
		return a
	}
	return b
}

func min(a, b int64) int64 {
	if a < b {
		return a
	}
	return b
}
```