|
| 1 | +import java.util.Scanner |
| 2 | + |
| 3 | +fun main(args: Array<String>) { |
| 4 | + val reader = Scanner(System.`in`) |
| 5 | + |
| 6 | + while (true) { |
| 7 | + val n: Int = reader.nextInt() |
| 8 | + if (n == 0) break |
| 9 | + |
| 10 | + var ranks = IntArray(n) |
| 11 | + var points = ArrayList<Point>() |
| 12 | + repeat(n) { i -> |
| 13 | + points.add(Point(i, reader.nextInt(), reader.nextInt())) |
| 14 | + } |
| 15 | + |
| 16 | + points.sort() |
| 17 | + |
| 18 | + findRank(ranks, points) |
| 19 | + |
| 20 | + println(ranks.joinToString(separator = " ")) |
| 21 | + } |
| 22 | + |
| 23 | + reader.close() |
| 24 | +} |
| 25 | + |
| 26 | +fun findRank(ranks: IntArray, points: List<Point>) : List<Point> { |
| 27 | + if (points.size <= 1) return points |
| 28 | + |
| 29 | + val leftPoints = findRank(ranks, points.subList(0, points.size / 2)) |
| 30 | + val rightPoints = findRank(ranks, points.subList(points.size / 2, points.size)) |
| 31 | + var resultPoints = ArrayList<Point>() |
| 32 | + |
| 33 | + var l: Int = 0 |
| 34 | + var r: Int = 0 |
| 35 | + while (true) { |
| 36 | + if (leftPoints[l].y <= rightPoints[r].y) { |
| 37 | + resultPoints.add(leftPoints[l++]) |
| 38 | + if (l == leftPoints.size) { |
| 39 | + rightPoints.listIterator(r).forEach { |
| 40 | + ranks[it.i] += l |
| 41 | + resultPoints.add(it) |
| 42 | + } |
| 43 | + break |
| 44 | + } |
| 45 | + } else { |
| 46 | + resultPoints.add(rightPoints[r]) |
| 47 | + ranks[rightPoints[r++].i] += l |
| 48 | + if (r == rightPoints.size) { |
| 49 | + resultPoints.addAll(leftPoints.subList(l, leftPoints.size)) |
| 50 | + break |
| 51 | + } |
| 52 | + } |
| 53 | + } |
| 54 | + |
| 55 | + return resultPoints |
| 56 | +} |
| 57 | + |
| 58 | +data class Point(val i: Int, val x: Int = 0, val y: Int = 0) : Comparable<Point> { |
| 59 | + override fun compareTo(other: Point) : Int = if (this.x == other.x) this.y.compareTo(other.y) else this.x.compareTo(other.x) |
| 60 | +} |
0 commit comments