usaco Window Area

矩形切割。话说usaco题目精简了之后,没有遇到网上说的第三章说的类似题目。

这题一直看不懂别人怎么切的。

睡了一觉醒来后就自己明白了。

/*
ID: modengd1
PROG: window
LANG: C++
*/
#include <iostream>
#include <stdio.h>
#include <memory.h>
#include <vector>
using namespace std;
struct WD
{
    bool exist;
    int x0,y0,x1,y1;
    int high;
};
WD allWD[62];
int H,L;
int getindex(char ch)
{
    if(ch<=‘z‘&&ch>=‘a‘)
        return ch-‘a‘;
    if(ch<=‘Z‘&&ch>=‘A‘)
        return ch-‘A‘+26;
    if(ch<=‘9‘&&ch>=‘0‘)
        return ch-‘0‘+52;
}
int getarea(int deep,int xx,int yy,int x_,int y_,int h)
{
    if(xx>=x_||yy>=y_)//矩形不合法
        return 0;
    if(deep==62)//浮到了最顶层
    {
        return (x_-xx)*(y_-yy);
    }
    if(!allWD[deep].exist||h>=allWD[deep].high||allWD[deep].x1<=xx||allWD[deep].x0>=x_||allWD[deep].y1<=yy||allWD[deep].y0>=y_)//不相交
    {
        return getarea(deep+1,xx,yy,x_,y_,h);
    }
    else//切割为上下左右四个部分
    {
        int ret=0;
        ret+=getarea(deep+1,xx,yy,allWD[deep].x0,y_,h);//上
        ret+=getarea(deep+1,allWD[deep].x1,yy,x_,y_,h);//下
        ret+=getarea(deep+1,max(xx,allWD[deep].x0),yy,min(x_,allWD[deep].x1),allWD[deep].y0,h);//左
        ret+=getarea(deep+1,max(xx,allWD[deep].x0),allWD[deep].y1,min(x_,allWD[deep].x1),y_,h);//右
        return ret;
    }
}
int main()
{
    freopen("window.in","r",stdin);
    freopen("window.out","w",stdout);
    char op;
    char id;
    WD newOne;
    H=L=0;
    for(int i=0;i<62;i++)
        allWD[i].exist=false;
    while(~scanf("%c",&op))
    {
        getchar();
        scanf("%c",&id);
        if(op==‘w‘)
        {
            int xx,yy,x_,y_;
            scanf(",%d,%d,%d,%d",&xx,&yy,&x_,&y_);
            newOne.x0=min(xx,x_);newOne.y0=min(yy,y_);//输入时将所有矩形的对角修改为左上角和右下角
            newOne.x1=max(xx,x_);newOne.y1=max(yy,y_);
            newOne.high=++H;
            newOne.exist=true;
            allWD[getindex(id)]=newOne;
        }
        else if(op==‘t‘)
        {
            allWD[getindex(id)].high=++H;

        }
        else if(op==‘b‘)
        {
            allWD[getindex(id)].high=--L;
        }
        else if(op==‘d‘)
        {
            allWD[getindex(id)].exist=false;
        }
        else
        {
            int index=getindex(id);
            int ans=getarea(0,allWD[index].x0,allWD[index].y0,allWD[index].x1,allWD[index].y1,allWD[index].high);
            int div=(allWD[index].x1-allWD[index].x0)*(allWD[index].y1-allWD[index].y0);
            printf("%.3f\n",(double)ans*100/div);

        }
        getchar();getchar();
    }
    return 0;
}

  

时间: 2024-10-21 23:41:17

usaco Window Area的相关文章

USACO window area 漂浮法

这道题是求解几个矩形未被遮挡的面积问题, 可以使用漂浮法来解决, 什么事漂浮法请看这里http://www.nocow.cn/index.php/USACO/window, 代码如下: /* ID: m1500293 LANG: C++ PROG: window */ #include <cstdio> #include <algorithm> #include <cstring> using namespace std; char s[80]; int buttom,

[USACO5.3]窗体面积Window Area

https://www.luogu.org/problemnew/show/P2745 上浮法...真是奇特的方法 考虑到我们要把矩形置顶,那么如果我们置顶到第k层,现在摆在我们面前的是第k层的矩形 将矩形分为四个继续上浮即可 原文地址:https://www.cnblogs.com/LM-LBG/p/10992892.html

jQZoom图片放大器插件。API说明文档,jQZoom使用说明

jQZoom是一个基于最流行的jQuery的图片放大器插件.它功能强大,使用简便.支持标准模式.反转模式.无镜头.无标题的放大,并可以自定义jQZoom的窗口位置和渐隐效果,修正IE6的select bug.使用之前,先引入jQZoom.js. zoomType,默认值:’standard’,另一个值是’reverse’,是否将原图用半透明图层遮盖. zoomWidth,默认值:200,放大窗口的宽度. zoomHeight,默认值:200,放大窗口的高度. xOffset,默认值:10,放大窗

SDL2源代码分析2:窗口(SDL_Window)

上一篇文章分析了SDL的初始化函数SDL_Init().这篇文章继续分析SDL的源代码.本文分析SDL的窗口(Window). SDL播放视频的代码流程如下所示. 初始化:  SDL_Init(): 初始化SDL. SDL_CreateWindow(): 创建窗口(Window). SDL_CreateRenderer(): 基于窗口创建渲染器(Render). SDL_CreateTexture(): 创建纹理(Texture). 循环渲染数据:  SDL_UpdateTexture(): 设

转:SDL2源代码分析

1:初始化(SDL_Init()) SDL简介 有关SDL的简介在<最简单的视音频播放示例7:SDL2播放RGB/YUV>以及<最简单的视音频播放示例9:SDL2播放PCM>中已经叙述过了,不再重复.这两篇文章中也提到了一张SDL的原理图,如下所示: 从这个图中可以看出,SDL根据系统的不同调用不同的API完成相应的功能.至于它是如何实现的,将会在后文中详细叙述.下面不再罗嗦,直接进入正题. 使用SDL播放一个视频代码流程大体如下 初始化: SDL_Init(): 初始化SDL. 

终端开发补充 : 读 curses模块官方文档...

curses是一个提供终端屏幕打印和键盘处理的库, 我个人的理解就是终端里的gui(当然它是基于文本的)... 写2048的时候用到了这个库, 所以现在过来好好研究一下这个库... 下面是文档内容 : 首先在你做任何事之前, 你必须先调用 initscr() 初始化curses, 这个函数主要的作用是决定当前终端的类型, 然后发送一些必要的设置给终端, 并且创建独立的内部数据结构. 如果成功初始化的话, 该函数会返回一个代表屏幕的对象, 我们通常称为 stdscr (C语言就有的惯例). 另一方

The TTY demystified

http://www.linusakesson.net/programming/tty/index.php The TTY demystified Real teletypes in the 1940s. The TTY subsystem is central to the design of Linux, and UNIX in general. Unfortunately, its importance is often overlooked, and it is difficult to

View机制深入学习(五) 事件处理机制一

以TouchEvent为主,看一下View和ViewGroup内部是如何处理Input Events的: 首先来看事件的产生来源: 一.获取事件: 事件的来源可以分为"软件","硬件"两种: 主要的事件包含有: 按键事件(KeyEvent) :即物理按键按下产生的事件,相关的常用物理按键一般有HOME,BACK等 触摸事件(TouchEvent): 鼠标事件(MouseEvent).轨迹球事件(TrackBallEvent)(这两个已经不常见): 针对所有事件的共性

遗传算法的应用(求解迷宫问题)

遗传算法(Genetic Algorithm): 是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法. 遗传算法是从代表问题可能潜在的解集的一个种群(population)开始的,而一个种群则由经过基因(gene)编码的一定数目的个体(individual)组成. 每个个体实际上是染色体(chromosome)带有特征的实体. 染色体作为遗传物质的主要载体,即多个基因的集合,其内部表现(即基因型)是某种基因组合,它决定了个体的形状的外