P6916 [ICPC 2015 WF] Window Manager

题目描述

过去几年,用户界面技术发生了一场革命。多年来,键盘和鼠标一直是与计算机交互的工具。但随着智能手机和平板电脑的推出,人们越来越多地通过在屏幕上敲击和移动手指来使用电脑。这自然导致了用户界面设计的新范式。一个重要的原则是显示器上的对象遵守“物理”定律。在这个问题中,您将看到一个例子。 您已被聘请为 window manager 构建一个模拟器,用于高级手机制造商(Advanced Cellular Manufacturers,ACM)的下一代智能手机。他们生产的每款手机都有一个矩形屏幕,可以完全显示零个或多个矩形窗口。也就是说,没有窗口超出屏幕边界或与任何其他窗口重叠。模拟器必须支持以下命令。 `OPEN x y w h` —— 打开一个具有左上角坐标 $(x,y)$、宽度 $w$ 像素和高度 $h$ 像素的新窗口。 `CLOSE x y` —— 关闭一个打开的窗口,其中包括 $(x,y)$ 处的像素。这允许用户点击窗口上的任意位置以关闭窗口。 `RESIZE x y w h` —— 将包含 $(x,y)$ 处像素的窗口尺寸设置为宽度 $w$ 像素和高度 $h$ 像素。窗口的左上角不移动。 `MOVE x y dx dy` —— 移动包含 $(x,y)$ 处像素的窗口。移动是水平方向上的 $dx$ 像素或垂直方向上的 $dy$ 像素。$dx$ 和 $dy$ 中最多有一个为非零。 ![](https://cdn.luogu.com.cn/upload/image_hosting/3zw4uj2x.png) _(图 1:移动示例)_ ACM 对 `MOVE` 命令特别自豪。正在移动的窗口可能会“撞上”另一个窗口。在这种情况下,第一个窗口将以相同的方向尽可能远地推动第二个窗口,就像这些窗口是物理对象一样。此行为可能会层叠 —— 移动的窗口可能会遇到其他窗口,这些窗口也会根据需要被推送。图 $1$ 显示了一个有三个窗口的示例,其中窗口 A 向右移动,推动其他两个窗口。

输入格式

第一行输入包含两个正整数 $x_{\max}$ 和 $y_{\max}$,即屏幕的水平和垂直尺寸,以像素为单位。 每个显示器的最大分辨率为 $10^9$(ACM 正计划建造具有极高分辨率的显示器)。 屏幕左上角的像素具有坐标 $(0,0)$。 下面的每一行都包含一个如上所述的命令。 命令名和参数之间用一个或多个空格分隔。 命令参数是满足这些条件的整数: - $0 \le x < x_{\max}$; - $0 \le y < y_{\max}$; - $1 \le w,h \le 10^9$; - $-10^9 \le dx,dy \le 10^9$; - $dx \cdot dy = 0$。 最多有 $256$ 条命令。

输出格式

输出必须遵循以下示例输出中所示的格式。 按照命令在输入中出现的顺序模拟命令。如果在命令模拟过程中检测到任何错误,请显示命令编号、命令名称和下表中的第一条适当消息,并忽略模拟该命令的结果(除非另有说明)。 如果在指定位置没有包含像素的窗口,则在给定位置没有窗口(用于关闭、调整大小和移动命令)。 如果生成的窗口与另一个窗口重叠或超出屏幕边界,则窗口不适用于“打开”和“调整大小”命令。 如果命令要求移动窗口 $d$ 个像素,则移动 $d'$ 而不是 $d$ —— 对于 `MOVE` 命令,但在要求窗口移动到屏幕边界之外之前,它只能移动 $d'$ 个像素。值 $d$ 和 $d'$ 分别是请求和移动的像素的绝对数量。在这种情况下,窗口仍会移动,但仅移动较小的距离。 模拟所有命令并显示任何错误消息后,指示仍打开的窗口数。然后,对于每个打开的窗口,按照打开的顺序显示左上角 $(x,y)$ 的坐标、宽度和高度。

说明/提示

时间限制:1000 毫秒,内存限制:1048576 kB。 该题出自:2015 年国际大学生编程大赛(ACM-ICPC)世界总决赛。