Advertisement
vkazar

Untitled

Nov 5th, 2023
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 7.74 KB | None | 0 0
  1. package sprint4.tasks
  2.  
  3. import java.io.BufferedReader
  4. import java.io.InputStreamReader
  5. import java.util.*
  6. import kotlin.math.min
  7.  
  8. private val coordModifiers =
  9.     buildSet {
  10.         for (x in 0..20)
  11.             for (y in 0..20)
  12.                 if (x * x + y * y <= 400) {
  13.                     add(x to y)
  14.                     add(x to -y)
  15.                     add(-x to y)
  16.                     add(-x to -y)
  17.                 }
  18.     }.toList()
  19.  
  20. data class Point(val x: Int, val y: Int)
  21.  
  22. private infix fun Int.to(other: Int) = Point(this, other)
  23.  
  24. private fun Point.checkDistance(other: Point): Boolean {
  25.     val (curX, curY) = this
  26.     var i = 0
  27.     return generateSequence {
  28.         if (i >= coordModifiers.size) {
  29.             null
  30.         } else {
  31.             val curModifier = coordModifiers[i++]
  32.             (curX + curModifier.x) to (curY + curModifier.y)
  33.         }
  34.     }
  35.         .any { it.x == other.x && it.y == other.y }
  36. }
  37.  
  38. fun main2() {
  39.     val buffer = BufferedReader(InputStreamReader(System.`in`))
  40.  
  41.     val metroStations = buildMap<Int, Point> {
  42.         repeat(buffer.readLine().toInt()) {
  43.             val tokenizer = StringTokenizer(buffer.readLine())
  44.             put(it + 1, tokenizer.nextToken().toInt() to tokenizer.nextToken().toInt())
  45.         }
  46.     }
  47.  
  48.     buildMap {
  49.         repeat(buffer.readLine().toInt()) {
  50.             val tokenizer = StringTokenizer(buffer.readLine())
  51.             val busStation = tokenizer.nextToken().toInt() to tokenizer.nextToken().toInt()
  52.             metroStations.forEach {
  53.                 if (it.value.checkDistance(busStation))
  54.                     compute(it.key) { _, v -> (v ?: 0) + 1 }
  55.             }
  56.         }
  57.     }
  58.         .maxWith(compareBy<Map.Entry<Int, Int>> { it.value }.thenByDescending { it.key })
  59.         .key
  60.         .let(::println)
  61. }
  62.  
  63. fun main4() {
  64.     val buffer = BufferedReader(InputStreamReader(System.`in`))
  65.  
  66.     //Запоминаем все станции метро в формате точка=id
  67.     val metroStations = buildMap<Point, Int> {
  68.         repeat(buffer.readLine().toInt()) {
  69.             val tokenizer = StringTokenizer(buffer.readLine())
  70.             put(tokenizer.nextToken().toInt() to tokenizer.nextToken().toInt(), it + 1)
  71.         }
  72.     }
  73.  
  74.     //Формируем результат: id метро = кол-во автобусных остановок вокруг
  75.     buildMap {
  76.         repeat(buffer.readLine().toInt()) {
  77.             val tokenizer = StringTokenizer(buffer.readLine())
  78.             //Считываем координаты очередной автобусной остановки
  79.             val curX = tokenizer.nextToken().toInt()
  80.             val curY = tokenizer.nextToken().toInt()
  81.  
  82.             //перебираем все точки в округе 20 около автобусной остановки
  83.             for (modifier in coordModifiers) {
  84.                 // проверяемая точка
  85.                 val potentialMetroStation = (curX + modifier.x) to (curY + modifier.y)
  86.                 // если в ней есть станция метро...
  87.                 if (metroStations[potentialMetroStation] != null) {
  88.                     //...то в результирующей мапе для этой станции метро увеличиваем кол-во автобусных остановок
  89.                     compute(metroStations[potentialMetroStation]!!) { _, v -> (v ?: 0) + 1 }
  90.                 }
  91.             }
  92.         }
  93.     }
  94.         // берём станцию, у которой максимальное кол-во остановок в округе
  95.         .maxWith(compareBy<Map.Entry<Int, Int>> { it.value }.thenByDescending { it.key })
  96.         .key
  97.         .let(::println)
  98. }
  99.  
  100. fun main() {
  101.     val buffer = BufferedReader(InputStreamReader(System.`in`))
  102.  
  103.     //Запоминаем все станции метро в формате точка=id
  104.     val metroStations = buildMap<Point, Int> {
  105.         repeat(buffer.readLine().toInt()) {
  106.             val tokenizer = StringTokenizer(buffer.readLine())
  107.             put(tokenizer.nextToken().toInt() to tokenizer.nextToken().toInt(), it + 1)
  108.         }
  109.     }
  110.  
  111.     var maxedStation: Pair<Int, Int> = Pair(metroStations.values.first(), 0)
  112.  
  113.     //Формируем результат: id метро = кол-во автобусных остановок вокруг
  114.     buildMap<Int, Int> {
  115.         repeat(buffer.readLine().toInt()) {
  116.             val tokenizer = StringTokenizer(buffer.readLine())
  117.             //Считываем координаты очередной автобусной остановки
  118.             val curX = tokenizer.nextToken().toInt()
  119.             val curY = tokenizer.nextToken().toInt()
  120.  
  121.             //перебираем все точки в округе 20 около автобусной остановки
  122.             for (modifier in coordModifiers) {
  123.                 // проверяемая точка
  124.                 val potentialMetroStation = (curX + modifier.x) to (curY + modifier.y)
  125.                 // если в ней есть станция метро...
  126.                 val potentialMetroStationId = metroStations[potentialMetroStation]
  127.                 if (potentialMetroStationId != null) {
  128.                     val curCount = compute(potentialMetroStationId) { _, v -> (v ?: 0) + 1 }!!
  129.                     maxedStation = when {
  130.                         curCount > maxedStation.second -> Pair(potentialMetroStationId, curCount)
  131.                         curCount == maxedStation.second -> Pair(
  132.                             min(potentialMetroStationId, maxedStation.first),
  133.                             curCount
  134.                         )
  135.                         else -> maxedStation
  136.                     }
  137.  
  138.                 }
  139.             }
  140.         }
  141.     }
  142.     println(maxedStation.first)
  143. }
  144.  
  145.  
  146. fun main3() {
  147.     val buffer = BufferedReader(InputStreamReader(System.`in`))
  148.  
  149.     // ключ -- id станции, значение -- кол-во остановок рядом
  150.     val result = mutableMapOf<Int, Int>()
  151.  
  152.     // индекс: ключ -- адрес точка, значение -- станции метро, которые близко к ней
  153.     val index = buildMap<Point, MutableList<Int>> {
  154.         repeat(buffer.readLine().toInt()) {
  155.             val metroStationId = it + 1
  156.             //Сначала заполняем результат: кол-во автобусных остановок пока неизвестно, поэтому 0
  157.             result[metroStationId] = 0
  158.  
  159.             val tokenizer = StringTokenizer(buffer.readLine())
  160.             val curX = tokenizer.nextToken().toInt()
  161.             val curY = tokenizer.nextToken().toInt()
  162.  
  163.             //Станция метро находится по координатам (curX, curY)
  164.             //Добавляем её в индекс для всех близлежащих точек
  165.             for (modifier in coordModifiers) {
  166.                 // текущая обрабатываемая точка
  167.                 val indexedPoint = (curX + modifier.x) to (curY + modifier.y)
  168.                 compute(indexedPoint) { _, v ->
  169.                     (v ?: mutableListOf()).apply { add(metroStationId) }
  170.                 }
  171.             }
  172.         }
  173.     }
  174.  
  175.     val busStationCount = buffer.readLine().toInt()
  176.     repeat(busStationCount) {
  177.         val tokenizer = StringTokenizer(buffer.readLine())
  178.         val curX = tokenizer.nextToken().toInt()
  179.         val curY = tokenizer.nextToken().toInt()
  180.         index[curX to curY]
  181.             ?.forEach {
  182.                 if (result[it] != null)
  183.                     result.compute(it) { _, v -> v!! + 1 }
  184.             }
  185.     }
  186.     result.maxBy { it.value }.key.let(::println)
  187. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement