- Описание
- Отправленные решения
15. Yandex Cells
Команда Яндекс.devtools разрабатывает редактор таблиц. Вам поручили написать модуль, обрабатывающий запросы объединения и разделения ячеек.
Таблица состоит из строк, пронумерованных от до , и столбцов, пронумерованных от до . Назовём \textit{элементарной ячейкой} область таблицы, находящуюся на пересечении некоторой строки и некоторого столбца. Каждая элементарная ячейка однозначно задаётся парой координат , где — номер строки, в которой находится элементарная ячейка, а — номер столбца, в которой находится элементарная ячейка. В каждый момент времени таблица разбита на непересекающиеся \textit{ячейки}. Ячейкой является непустая прямоугольная область таблицы, образованная объединением некоторого множества элементарных ячеек. Более формально любая ячейка задаётся четвёркой чисел и состоит из объединения всех элементарных ячеек с координатами такими, что и .
Для удобства работы с таблицами для каждой таблицы существует её ASCII-представление. ASCII-представление таблицы состоит из символов -
, |
, +
и пробела. Для каждой строки фиксируется высота , а для каждого столбца фиксируется ширина . ASCII-представлением таблицы является матрица из символов с строками, пронумерованными от до , и столбцами, пронумерованными от до . Ячейке, заданной четвёркой чисел , соответствует подматрица матрицы символов, состоящая из символов с координатами такими, что и .
Назовём элемент матрицы с координатами горизонтальным разделителем
, если выполнено одно из следующих условий:
- Хотя бы один из элементов , не существует (то есть или ).
- Элементы и существуют и принадлежат различным ячейкам.
Назовём элемент матрицы с координатами вертикальным разделителем
, если выполнено одно из следующих условий:
- Хотя бы один из элементов , не существует (то есть или ).
- Элементы и существуют и принадлежат различным ячейкам.
Назовём элемент матрицы с координатами \textit{крестообразным разделителем}, если он не принадлежит ни одной ячейке и среди четырёх элементов , , и найдётся хотя бы один горизонтальный и вертикальный разделитель.
Символ, соответствующий элементу матрицы с координатами , определяется следующими правилами:
- Если элемент матрицы принадлежит некоторой ячейке, то он обозначается пробелом.
- Если элемент матрицы является горизонтальным разделителем, но не является крестообразным разделителем, то он обозначается символом
|
. - Если элемент матрицы является вертикальным разделителем, но не является крестообразным разделителем, то он обозначается символом
-
. - Если элемент матрицы является крестообразным разделителем, то он обозначается символом
+
.
На вход модуль принимает ASCII-описание таблицы. Некоторые клетки уже могут быть объединены.
Затем к модулю поступает запросов одного из двух типов:
split pos
— разделить объединенную ячейку, содержащую элементарную ячейку с координатойpos
на элементарные ячейки.- Если ячейка с координатой
pos
элементарная, то модуль должен вывестиCan not split elementary cell
- Иначе модуль должен разделить данную ячейку на элементарные и вывести
Split onto NUM cells
, гдеNUM
— количество образованных элементарных ячеек.
- Если ячейка с координатой
merge pos1 pos2
— объединить ячейки, содержащие элементарные ячейки с координатамиpos1
иpos2
соответственно- Если данные элементарные ячейки содержатся в одной и той же объединенной ячейке, то модуль должен вывести
Can not merge cell with itself
- Иначе если эти объединенные ячейки выровнены горизонтально (левая граница одной ячейки полностью совпадает с правой границей другой ячейки), то модуль должен объединить их и вывести
Merged horizontally-aligned cells
- Иначе если эти объединенные ячейки выровнены вертикально (нижняя граница одной ячейки полностью совпадает с верхней границей другой ячейки), то модуль должен объединить их и вывести
Merged vertically-aligned cells
- Иначе модуль должен вывести
Can not merge unaligned cells
- Если данные элементарные ячейки содержатся в одной и той же объединенной ячейке, то модуль должен вывести
После вывода статуса каждого запроса который изменил таблицу модуль должен вывести и полученную таблицу.
Формат ввода
Первая строка содержит два целых числа и (; ) — количество строк и столбцов, задающих ASCII-описание таблицы.
Следующие строк содержат по символов каждый и задают ASCII-описание таблицы.
Следующая строка содержит целое число () — количество строк таблицы.
Следующая строка содержит целых чисел (; ) — высоты строк таблицы.
Следующая строка содержит целое число () — количество столбцов таблицы.
Следующая строка содержит целых чисел (; ) — ширины столбцов таблицы.
Следующая строка содержит целое число () — количество запросов к модулю.
Следующие строк содержат запросы к модулю в формате, указанном выше.
Координаты ячейки описываются как , где — номер строки (), а — номер столбца, столбцы нумеруются так:
Формат вывода
Для каждого запроса выведите его статус и в случае его успешного завершения таблицу, получившуюся в результате применения этого запроса.
Ограничения
Ограничение времени
1 с
Ограничение памяти
512 МБ
Пример 1
5 11
+--+------+
| | |
+--+----+-+
| | |
+-------+-+
2
1 1
3
2 4 1
6
merge B1 A2
merge A2 C2
merge A2 B2
split A1
split C2
merge A1 A2
Can not merge unaligned cells
Merged horizontally-aligned cells
+--+------+
| | |
+--+------+
| |
+---------+
Can not merge cell with itself
Can not split elementary cell
Split onto 3 cells
+--+------+
| | |
+--+----+-+
| | | |
+--+----+-+
Merged vertically-aligned cells
+--+------+
| | |
| +----+-+
| | | |
+--+----+-+