[USACO5.3.2] 窗体面积 - 矩形切割


题目描述

你刚刚接手一项窗体界面工程。窗体界面还算简单,而且幸运的是,你不必显示实际的窗体。有 5 种基本操作:

  创建一个新窗体
  将窗体置顶
  将窗体置底
  删除一个窗体
输出窗体可见部分的百分比(就是,不被其它窗体覆盖的部分)。
在输入文件中,操作以如下的格式出现。

  创建一个新窗体:w(I,x,y,X,Y)
  将窗体置顶: t(I)
  将窗体置底: b(I)
  删除一个窗体:d(I)
  输出窗体可见部分的百分比:s(I)
I 是每个窗体唯一的标识符。表示符可以是 ‘a’..’z’, ‘A’..’Z’ 和 ‘0’..’9’ 中的任何一个。输入文件中没有多余的空格。
(x,y)和(X,Y)是窗体的对角。当你创建一个窗体的时候,它自动被“置顶”。你不能用已经存在的标识符来创建窗体,但是你  可以删除一个窗体后再用已删除窗体的标识符来创建窗体。坐标用正整数来表示,并且所有的窗体面积都不为 0(x <> X 且 y <> Y)。x 坐标和 y 坐标在 1 —— 32767 的范围内。


输入格式

输入文件包含给你的解释程序的一系列命令,每行一个。当输入文件结束时,停止程序。


输出格式

只对于 s() 命令进行输出。当然,输入文件可能有许多 s() 命令,所以输出文件应该是一个百分比的序列,每行一个,百分比是窗体可见部分的百分比。百分比应该四舍五入到三位小数。


样例数据

样例输入

w(a,10,132,20,12)
w(b,8,76,124,15)
s(a)

样例输出

49.167


说明

插入操作不超过150
总操作次数不超过1000


题目分析

这应该算是usaco史上最为恶心的调试题了吧(当然素数方阵更厉害)
对于每一个窗体看做一个矩形
维护一个队列
新加的窗体加入队尾
如果要置顶一个窗体,将他从队列中转到队尾
如果要置底一个窗体,将他从队列中转到队首
如果删除一个窗体,将他从队列中删除
以上操作均不用加入切割

如果查询,那么将队列中所有窗体顺序进行切割,统计面积
查询完毕后清空矩形切割中的矩形


源代码

#include<algorithm>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<cmath>
#include<queue>
#include<map>
using namespace std;
inline const int Get_Int() {
    int num=0,bj=1;
    char x=getchar();
    while(x<'0'||x>'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值