B. Виджетийн сан

хугацааны хязгаарлалт 2 секунд

санах ойн хязгаарлалт 256 мегабайт

оролт стандарт оролт

гаралт стандарт гаралт

Вася график хэрэглэгчийн орчныг бүрдүүлэхдээ өөрийнхөө санг ашигладаг. Вася өөрийнхөө бүтээлийг VTK (VasyaToolKit) гэж нэрлэсэн. Энэ сангийн нэг сонирхолтой зүйл нь сан доторх виджетүүд бие биендээ агуулагдаж байдаг.

Виджет бол график хэрэглэгчийн орчний нэг элемент юм. Виджет болгон өндөр болон өргөнтэй ба дэлгэцийн зарим хэсгийг эзэлдэг. Васягийн санд байгаа виджет болгон Widget гэсэн төрөлд хамаардаг. Би хялбар аргаар энэхүү виджет болон түүний төрлийг тогтоох болно.

HBox$ ба VBox$ төрлүүд нь Widget төрлөөс үүсэлтэй. HBox$ ба VBox$ төрлийн виджетүүд онцгой. Тэд дотроо өөр виджетүүдийг агуулж болдог. Эдгээр төрлүүд хоёулаа pack()$ хэрэглүүрийг ашиглаж өөртөө виджет багтаадаг. pack()$ хэрэглүүрийг ашигласны үр дүнд зөвхөн холбоотой виджетүүд хадгалагддаг, хэрэв тэрхүү виджет нь өөрчлөгдвөл виджет дотор байсан зураг нь бас өөрчлөгдөнө.

Бид хэрэв $a = c_{1}, c_{2}, ..., c_{k} = b$, $k ≥ 2$ байх нөхцлийг хангадаг гинжин цуваа үүсдэг бол $a$ виджет $b$ виджетэд багтдаг байх юм. Энд бүх $1 ≤ i < k$ хувьд $c_{i}$ нь $c_{i + 1}$-д агуулагддаг байна. Васягийн санд $a$ виджет $a$ виджетэд агуулагдах ёсгүй (өөрөө өөрийгөө агуулдаггүй). Хэрэв агуулах үйлдлийг өгвөл шууд алдаа гардаг.

Бас HBox$ ба VBox$ виджетүүдэд border$ ба spacing$ гэсэн параметр байдаг. Харгалзан set_border()$ ба set_spacing()$ хэрэглүүрүүдээр тодорхойлогддог. Анхандаа эдгээр параметрүүд $0$ байна.

Дээрх зураг HBox$ ба VBox$-д яаж виджет агуулагдаж байгааг харуулав. HBox$ ба VBox$ агуулж байгаа виджетийн хэмжээнээс болоод автоматаар хэмжээгээ өөрчилдөг. HBox$ ба VBox$-уудын ялгаатай зүйл нь HBox$ виджетэд виджет хөндлөнгөөрөө агуулагддаг бол VBox$-д босоогоороо агуулагддаг. spacing$ параметр нь хөрш виджетүүдийн зайг илэрхийлнэ. border$ бол агуулагдаж байгаа виджетүүдийн хүрээ хүртэлх зайг илэрхийлнэ. Виджетүүд pack()$ хэрэглүүрийг ашигласан дарааллаар агуулагдана. Хэрэв HBox$ ба VBox$ -д ямар нэг виджет агуулагддаггүй бол border$ болон spacing$-ийн утгаас үл хамааран хэмжээ нь $0 × 0$ байна.

Бүх виджетүүдийг VasyaScript$ хэмээх скрипт хэлээр байгуулдаг. Тайлбарыг оролтод тайлбарласан.

Эцэст нь таниас бүх виджетүүдийн хэмжээг VasyaScript$ хэлэнд байгаа кодыг ашиглаад шалгаж өгөхийг хүссэн юм.

Оролт

Эхний мөрөнд $n$ бүхэл тоо -- үйлдлийн тоо ($1 ≤ n ≤ 100$). Дараагийн $n$ мөрөнд VasyaScript$ хэлэнд бичигдсэн үйлдлүүд доорх хэлбэрээр өгөгдөнө.

  • "Widget name$" -- шинэ [name]$ нэртэй Widget$ төрлийн [x]$ нэгж өргөнтэй, [y]$ нэгж өндөртэй виджет үүсгэнэ.
  • "HBox [name]$" -- [name]$ нэртэй HBox$ төрлийн шинэ виджет үүсгэнэ.
  • "VBox [name]$" -- [name]$ нэртэй VBox$ төрлийн шинэ виджет үүсгэнэ.
  • "[name1].pack([name2])$" -- [name2]$ виджетийг [name1]$ виджетэд багтаа. [name1]$ нэртэй виджет заавал HBox$ эсвэл VBox$ төрлийн байна.
  • "[name].set_border([x])$" -- [name]$ нэртэй виджетийн border$ параметрийг [x]$ нэгж болгон өөрчлөнө. [name1]$ нэртэй виджет заавал HBox$ эсвэл VBox$ төрлийн байна.
  • "[name].set_spacing([x])$" -- [name]$ нэртэй виджетийн spacing$ параметрийг [x]$ нэгж болгон өөрчлөнө. [name1]$ нэртэй виджет заавал HBox$ эсвэл VBox$ төрлийн байна.

Бүх үйлдлүүдийн эхэн болон төгсгөл хоосон зай биш. Үйлдэл доторх үгүүд хоорондоо яг 1 зайгаар тусгаарлагдсан байна. Тоо болгоны өмнө болон хойно хоосон зай байхгүй.

Үсгийн том жижиг байх нь хамаатай. Жишээ нь, "wiDget x$" буруу үйлдэл юм. Оролтын мэдээлэл бүгд үнэн зөв байна.

Бүх виджетүүдийн нэр $1$-ээс $10$ урттай жижиг латин үсгээс тогтно. Бүх виджетүүдийн нэр хос хосоороо өөр байна. Скриптэд байгаа бүх тоонууд $0$-ээс $100$ хооронд байна.

Оролтод өгөх скрипт нь үнэн зөв бөгөөд, өөрөө өөрийгөө агуулах үйлдэл эсвэл виджет байхгүй. Скрипт болгон ядаж нэг виджет үүсгэнэ.

Гаралт

Виджет болгоны хувьд нэрнийх нь цагаан толгойн дарааллаар өргөн болон өндрийг зайгаар тусгаарлан хэвлэнэ.

C++ хэл дээр 64-битийн тоо хэрэглэх үед %lld-г хэрэглэхгүй байхыг зөвлөж байна. %I64d эсвэл cin, cout стриймийг ашиглана уу.

Орчуулсан: Б.Алтангэрэл

Жишээ тэстүүд

Оролт
12
Widget me(50,40)
VBox grandpa
HBox father
grandpa.pack(father)
father.pack(me)
grandpa.set_border(10)
grandpa.set_spacing(20)
Widget brother(30,60)
father.pack(brother)
Widget friend(20,60)
Widget uncle(100,20)
grandpa.pack(uncle)
Гаралт
brother 30 60
father 80 60
friend 20 60
grandpa 120 120
me 50 40
uncle 100 20
Оролт
15
Widget pack(10,10)
HBox dummy
HBox x
VBox y
y.pack(dummy)
y.set_border(5)
y.set_spacing(55)
dummy.set_border(10)
dummy.set_spacing(20)
x.set_border(10)
x.set_spacing(10)
x.pack(pack)
x.pack(dummy)
x.pack(pack)
x.set_border(0)
Гаралт
dummy 0 0
pack 10 10
x 40 10
y 10 10

Тэмдэглэл

Эхний жишээг дараах байдлаар зохицуулна :

Сэтгэгдлүүдийг ачааллаж байна...