Advertisement
vkazar

Untitled

Sep 25th, 2023
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 3.08 KB | None | 0 0
  1. package sprint3.tasks.N
  2.  
  3. import java.io.BufferedReader
  4. import java.io.InputStreamReader
  5. import java.util.*
  6.  
  7. fun main() {
  8.     val reader = BufferedReader(InputStreamReader(System.`in`))
  9.     val size = reader.readLine().toInt()
  10.     List(size) {
  11.         val tokenizer = StringTokenizer(reader.readLine())
  12.         listOf(
  13.             Token(tokenizer.nextToken().toInt(), TokenType.OPEN),
  14.             Token(tokenizer.nextToken().toInt(), TokenType.CLOSE)
  15.         )
  16.     }
  17.         .flatten()
  18.         .sortFlowerBeds()
  19.         .mergeFlowerBeds()
  20.         .joinToString("") {
  21.             if (it.type == TokenType.OPEN) "${it.value} "
  22.             else "${it.value}\n"
  23.         }
  24.         .let(::println)
  25. }
  26.  
  27. private fun List<Token>.sortFlowerBeds(): List<Token> {
  28.     if (size == 1) return this
  29.  
  30.     val mid = size / 2
  31.     val l = subList(0, mid).sortFlowerBeds()
  32.     val r = subList(mid, size).sortFlowerBeds()
  33.     val res = mutableListOf<Token>()
  34.     var li = 0
  35.     var ri = 0
  36.     var k = 0
  37.     while (li < l.size && ri < r.size) {
  38.         val leftElement = l[li]
  39.         val rightElement = r[ri]
  40.         if (leftElement < rightElement) {
  41.             res.add(leftElement)
  42.             ++li
  43.         } else {
  44.             res.add(rightElement)
  45.             ++ri
  46.         }
  47.         k++
  48.     }
  49.  
  50.     if (li < l.size) {
  51.         res.addAll(l.subList(li, l.size))
  52.     }
  53.     if (ri < r.size) {
  54.         res.addAll(r.subList(ri, r.size))
  55.     }
  56.     return res
  57. }
  58.  
  59. private fun List<Token>.mergeFlowerBeds(): List<Token> {
  60.     var openCounter = 0
  61.     val res = mutableListOf<Token>()
  62.     for (fb in this) {
  63.         //Если стек пуст, то на входе должен быть открывающий токен. Если не так, то проблема в сортировке
  64.         if (openCounter==0) {
  65.             res.add(fb)
  66.             ++openCounter
  67.             continue
  68.         }
  69.         //Если есть открытый интервал,
  70.         //то при открытии увеличиваем каунтер
  71.         if (fb.type == TokenType.OPEN) {
  72.             ++openCounter
  73.             continue
  74.         }
  75.         //а при закрытии -- уменьшаем
  76.         --openCounter
  77.         //Если уменьшение привело к отсутствию открытых интервалов, значит текущее закрытие закрыло интервал, запоминаем
  78.         if (openCounter==0)
  79.             res.add(fb)
  80.     }
  81.     return res
  82. }
  83.  
  84.  
  85. data class Token(val value: Int, val type: TokenType) : Comparable<Token> {
  86.     override fun compareTo(other: Token): Int {
  87.         if (value == other.value) {
  88.             return type.height.compareTo(other.type.height)
  89.         }
  90.  
  91.         return value.compareTo(other.value)
  92.     }
  93.  
  94.     override fun toString(): String {
  95.         return "$value$type"
  96.     }
  97. }
  98.  
  99. enum class TokenType(val height: Int) {
  100.     OPEN(1),
  101.     CLOSE(2);
  102.  
  103.     override fun toString(): String {
  104.         return when (this) {
  105.             OPEN -> "+"
  106.             CLOSE -> "-"
  107.         }
  108.     }
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement