https://www.bnuoj.com/v3/contest_show.php?cid=9147#problem/H

【题意】

在一个长为H,宽为W的白墙上选一个矩形区域涂颜色,后涂的颜色会覆盖先涂的,题目给出n(n<=100)个矩形区域和对应的颜色。

求最后墙上每种颜色的面积是多少,共有多少种颜色。

【思路】

将墙分成一块一块的矩形区域,对每个区域判断最后涂的颜色是什么,将其面积加到对应的颜色上。关键是怎样将矩形分块:

将竖线(所有矩形的left和right)离散化,从左到右枚举相邻的竖线;

对固定的两条竖线,枚举覆盖这两条竖线的矩形,再离散化横线(所有合法矩形的top和bottom);

对当前的每个矩形区域,遍历所有的合法矩形,判断哪个是最后涂的。

时间复杂度是O(2n*2n*n)即O(n^3)。

【Accepted】

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm> using namespace std;
int H,W;
int n;
const int maxn=4e2+;
int cnt;
struct Rec
{
int T,L,B,R,c,o;
void input(int o_)
{
o=o_;
scanf("%d%d%d%d%d",&T,&L,&B,&R,&c);
}
}rec[maxn/];
int area[maxn];
vector<int> v;
int w[maxn];
int h[maxn];
void init()
{
cnt=;
memset(area,,sizeof(area));
}
int main()
{
int cas=;
while(~scanf("%d%d",&H,&W))
{
if(!H&&!W)
{
break;
}
init();
scanf("%d",&n);
for(int i=;i<=n;i++)
{
rec[i].input(i);
w[++cnt]=rec[i].L;
w[++cnt]=rec[i].R;
}
getchar();
sort(w+,w+cnt+);
cnt=unique(w+,w+cnt+)-(w+);
for(int i=;i<cnt;i++)
{
v.clear();
int tot=;
for(int k=;k<=n;k++)
{
if(rec[k].L<=w[i]&&w[i+]<=rec[k].R)
{
h[++tot]=rec[k].T;
h[++tot]=rec[k].B;
v.push_back(k);
}
}
sort(h+,h+tot+);
tot=unique(h+,h+tot+)-(h+);
int sz=v.size();
for(int k=;k<tot;k++)
{
int pos=-;
for(int j=;j<sz;j++)
{
if(rec[v[j]].T<=h[k]&&h[k+]<=rec[v[j]].B)
{
if(pos<rec[v[j]].o)
{
pos=rec[v[j]].o;
}
}
}
if(pos!=-)
{
area[rec[pos].c]+=(w[i+]-w[i])*(h[k+]-h[k]);
}
}
}
if(cas)
{
puts("");
}
printf("Case %d:\n",++cas);
int ans=;
for(int i=;i<=;i++)
{
if(area[i]>)
{
ans++;
printf("%d %d\n",i,area[i]);
}
}
if(ans==)
{
puts("There is 1 color left on the wall.");
}
else
{
printf("There are %d colors left on the wall.\n",ans);
}
}
return ;
}

【分段哈希】H. Paint the Wall的更多相关文章

  1. HDU 4391 Paint The Wall(分块+延迟标记)

    Paint The Wall Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  2. 线段树 扫描线 L - Atlantis HDU - 1542 M - City Horizon POJ - 3277 N - Paint the Wall HDU - 1543

    学习博客推荐——线段树+扫描线(有关扫描线的理解) 我觉得要注意的几点 1 我的模板线段树的叶子节点存的都是 x[L]~x[L+1] 2 如果没有必要这个lazy 标志是可以不下传的 也就省了一个pu ...

  3. HDU 4391 - Paint The Wall - 分块哈希入门

    题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=4391 题意 : 给一段区间, 有两种操作 1 : 给 x 到 y 的区间染色为 z 2 : 查询 ...

  4. 【HDU4391】【块状链表】Paint The Wall

    Problem Description As a amateur artist, Xenocide loves painting the wall. The wall can be considere ...

  5. hdu 1543 Paint the Wall

    http://acm.hdu.edu.cn/showproblem.php?pid=1543 #include <cstdio> #include <cstring> #inc ...

  6. ZOJ 2747 Paint the Wall(离散化+暴力)题解

    题意:给你一个面,然后涂颜色,问你最后剩多少颜色,每种颜色面积. 思路:第一反应是二维线段树,代码又臭又长,可以做.但是这题暴力+离散化就可以过.可以看到他给的n只有100,也就是说最坏情况下会涂10 ...

  7. Paint the Wall ZOJ - 2747

    点数很多,坐标值很大,然后离散化一下用一个点表示一小块的面积对应的颜色,然后更新的时候一块一块更新,查询的时候一块一块查询 #include<map> #include<set> ...

  8. HDU 4391 Paint The Wall 段树(水

    意甲冠军: 特定n多头排列.m操作 以下是各点的颜色 以下m一种操纵: 1 l r col 染色 2 l r col 问间隔col色点 == 通的操作+区间内最大最小颜色数的优化,感觉非常不科学... ...

  9. HDU 4391 Paint The Wall(分块的区间维护)

    题意:给出几个操作,把l-r赋值为z,询问l-r有几个z,其中z < INT_MAX 思路:因为z很大,所以很难直接用线段树去维护.这里可以使用分块来解决.我们可以让每个块用map去储存map[ ...

随机推荐

  1. qconshanghai2017

    https://2017.qconshanghai.com/schedule 第一天 (2017/10/17 星期二) 时间 日程 07:45-09:00 签到 上午 主题演讲 软件质量优化与平台创新 ...

  2. C#将excel数据按照需求导入Sql server遇到的问题(参考而已)

    1.千万不要使用永中表格(WPS没用过,这里只是个人观点,不是说永中表格的) 我在公司得到的任务是将excel数据按照需求导入数据库总共主表大概3张,所以有点复杂(列子用的简单表,公司东西还是不要放出 ...

  3. AJPFX关于Class类和Class类实例

    Java程序中的各个Java类属于同一类事物,描述这类事物的Java类就是Class类.对比提问:众多的人用一个什么类表示?众多的Java类用一个什么类表示?人  PersonJava类  Cla ...

  4. AJPFX关于Swing组件的总结

    默认布局管理器是流式布局(FlowLayout) 按钮的建立: jb1=new JButton("香蕉") 面板的建立:jp1=new JPanel(); 设置JFrame的标题: ...

  5. git diff查看修改,出现^M换行问题

    通过命令git diff查看修改,出现^M换行问题,如图: 解决: git config --global core.whitespace cr-at-eol 换行符的问题: 提交时转换为LF,检出时 ...

  6. win应用只允许单个实例运行,并将已运行实例窗口置顶

    关键词:windows,c++,桌面应用,单个实例,窗口置顶 目标:1.判断本程序是否已有一个实例在运行.2.若有,则激活已在运行的实例(将其窗口置顶),并退出当前运行. 1.使用semaphore来 ...

  7. 聊聊JavaScript和Scala的表达式 Expression

    我们先看下面这段简单的JavaScript代码. 我在第10行调用了函数f,其中传入的第二个和第三个参数都是一个逗号表达式. 函数f的实现,会检查这两个参数的类型,如果是函数,则执行函数调用,再打印其 ...

  8. linux 隐藏进程

    1.首先推荐一个后门程序https://github.com/f0rb1dd3n/Reptile 具体可以了解一下功能非常强大. 2.源码如下 root@ubuntu:/var/srt/libproc ...

  9. CAD交互绘制文字(网页版)

    在CAD设计时,需要绘制文字,用户可以设置设置绘制文字的高度等属性. 主要用到函数说明: _DMxDrawX::DrawText 绘制一个单行文字.详细说明如下: 参数 说明 DOUBLE dPosX ...

  10. Linux之常用Shell脚本总结

    一.简介本文将总结一些常用的shell脚本,方便以后工作中使用. 二.shell脚本[a]定期备份mysql数据库,需结合cronb定时任务调度实现. #!/bin/bash#首先声明一些自定义变量 ...