Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package sprint3.tasks.N
- import java.io.BufferedReader
- import java.io.InputStreamReader
- import java.util.*
- fun main() {
- val reader = BufferedReader(InputStreamReader(System.`in`))
- val size = reader.readLine().toInt()
- List(size) {
- val tokenizer = StringTokenizer(reader.readLine())
- listOf(
- Token(tokenizer.nextToken().toInt(), TokenType.OPEN),
- Token(tokenizer.nextToken().toInt(), TokenType.CLOSE)
- )
- }
- .flatten()
- .sortFlowerBeds()
- .mergeFlowerBeds()
- .joinToString("") {
- if (it.type == TokenType.OPEN) "${it.value} "
- else "${it.value}\n"
- }
- .let(::println)
- }
- private fun List<Token>.sortFlowerBeds(): List<Token> {
- if (size == 1) return this
- val mid = size / 2
- val l = subList(0, mid).sortFlowerBeds()
- val r = subList(mid, size).sortFlowerBeds()
- val res = mutableListOf<Token>()
- var li = 0
- var ri = 0
- var k = 0
- while (li < l.size && ri < r.size) {
- val leftElement = l[li]
- val rightElement = r[ri]
- if (leftElement < rightElement) {
- res.add(leftElement)
- ++li
- } else {
- res.add(rightElement)
- ++ri
- }
- k++
- }
- if (li < l.size) {
- res.addAll(l.subList(li, l.size))
- }
- if (ri < r.size) {
- res.addAll(r.subList(ri, r.size))
- }
- return res
- }
- private fun List<Token>.mergeFlowerBeds(): List<Token> {
- var openCounter = 0
- val res = mutableListOf<Token>()
- for (fb in this) {
- //Если стек пуст, то на входе должен быть открывающий токен. Если не так, то проблема в сортировке
- if (openCounter==0) {
- res.add(fb)
- ++openCounter
- continue
- }
- //Если есть открытый интервал,
- //то при открытии увеличиваем каунтер
- if (fb.type == TokenType.OPEN) {
- ++openCounter
- continue
- }
- //а при закрытии -- уменьшаем
- --openCounter
- //Если уменьшение привело к отсутствию открытых интервалов, значит текущее закрытие закрыло интервал, запоминаем
- if (openCounter==0)
- res.add(fb)
- }
- return res
- }
- data class Token(val value: Int, val type: TokenType) : Comparable<Token> {
- override fun compareTo(other: Token): Int {
- if (value == other.value) {
- return type.height.compareTo(other.type.height)
- }
- return value.compareTo(other.value)
- }
- override fun toString(): String {
- return "$value$type"
- }
- }
- enum class TokenType(val height: Int) {
- OPEN(1),
- CLOSE(2);
- override fun toString(): String {
- return when (this) {
- OPEN -> "+"
- CLOSE -> "-"
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement