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. 堆参数-XMS 与-XMX的说明

    XMS : JVM初始分配的堆内存 XMX : JVM最大允许分配的堆内存,按需分配 堆内存分配: JVM初始分配的堆内存由-Xms指定,默认是物理内存的1/64: JVM最大分配的堆内存由-Xmx指 ...

  2. html到计时特效(直接代码)

    <!DOCTYPE html> <head> <meta http-equiv="Content-Type" content="text/h ...

  3. AJPFX关于对集合中的元素删除操作和注意点

    import java.util.ArrayList;import java.util.Iterator;import java.util.List; public class ForeTest2 { ...

  4. 【学习笔记】深入理解js原型和闭包(0)——目录

    文章转载:https://www.cnblogs.com/wangfupeng1988/p/4001284.html 说明: 本篇文章一共16篇章,外加两篇后补的和一篇自己后来添加的学习笔记,一共19 ...

  5. TFS2010单独安装配置tfs build server

    记录一下确实很磨人. 同样硬件和软件环境的两台服务器,其中一台服务器很久之前就配置好了tfs2010 build ,然后最近想再配置一台tfs build server,但是按照以前的配置流程始终提示 ...

  6. 用python+pygame写贪吃蛇小游戏

    因为python语法简单好上手,前两天在想能不能用python写个小游戏出来,就上网搜了一下发现了pygame这个写2D游戏的库.了解了两天再参考了一些资料就开始写贪吃蛇这个小游戏. 毕竟最开始的练手 ...

  7. python3.7 socket通信

    def OpenClient(self,e): global line line = socket.socket(socket.AF_INET,socket.SOCK_STREAM) line.bin ...

  8. 关于sigleton模式

    单例模式的要点有三个:一是某个类只能有一个实例:二是它必须自行创建这个实例:三是它必须自行向整个系统提供这个实例. 从具体实现角度来说,就是以下三点:一是单例模式的类只提供私有的构造函数,二是类定义中 ...

  9. springboot测试的时候插入数据: error performing isolated work; SQL [n/a]; nested exception is org.hibernate...

    上网查了一下,说的是自增惹得麻烦!!在@GeneratedValue后面加上框框中的内容就OK拉!

  10. linux 复制文件夹内所有文件到另一个文件夹

    cp -Rf /home/user1/* /root/temp/将 /home/user1目录下的所有东西拷到/root/temp/下而不拷贝user1目录本身.即格式为:cp -Rf 原路径/ 目的 ...