【分段哈希】H. Paint the Wall
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的更多相关文章
- HDU 4391 Paint The Wall(分块+延迟标记)
Paint The Wall Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 线段树 扫描线 L - Atlantis HDU - 1542 M - City Horizon POJ - 3277 N - Paint the Wall HDU - 1543
学习博客推荐——线段树+扫描线(有关扫描线的理解) 我觉得要注意的几点 1 我的模板线段树的叶子节点存的都是 x[L]~x[L+1] 2 如果没有必要这个lazy 标志是可以不下传的 也就省了一个pu ...
- HDU 4391 - Paint The Wall - 分块哈希入门
题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=4391 题意 : 给一段区间, 有两种操作 1 : 给 x 到 y 的区间染色为 z 2 : 查询 ...
- 【HDU4391】【块状链表】Paint The Wall
Problem Description As a amateur artist, Xenocide loves painting the wall. The wall can be considere ...
- hdu 1543 Paint the Wall
http://acm.hdu.edu.cn/showproblem.php?pid=1543 #include <cstdio> #include <cstring> #inc ...
- ZOJ 2747 Paint the Wall(离散化+暴力)题解
题意:给你一个面,然后涂颜色,问你最后剩多少颜色,每种颜色面积. 思路:第一反应是二维线段树,代码又臭又长,可以做.但是这题暴力+离散化就可以过.可以看到他给的n只有100,也就是说最坏情况下会涂10 ...
- Paint the Wall ZOJ - 2747
点数很多,坐标值很大,然后离散化一下用一个点表示一小块的面积对应的颜色,然后更新的时候一块一块更新,查询的时候一块一块查询 #include<map> #include<set> ...
- HDU 4391 Paint The Wall 段树(水
意甲冠军: 特定n多头排列.m操作 以下是各点的颜色 以下m一种操纵: 1 l r col 染色 2 l r col 问间隔col色点 == 通的操作+区间内最大最小颜色数的优化,感觉非常不科学... ...
- HDU 4391 Paint The Wall(分块的区间维护)
题意:给出几个操作,把l-r赋值为z,询问l-r有几个z,其中z < INT_MAX 思路:因为z很大,所以很难直接用线段树去维护.这里可以使用分块来解决.我们可以让每个块用map去储存map[ ...
随机推荐
- ping localhost 返回 ::1的导致不能打开http://localhost的原因及解决
虽然可以在浏览器中正常访问http://localhost但用file,file_get_contents等函数打开http://localhost异常.用127.0.0.1也可以打开,本地hosts ...
- 第一章、 CLR的执行模型
1. 概述 本章主要是介绍从源代码到可执行程序的过程中,CLR所做的工作. 2. 名词解释 ① 公共语言运行时(Common Language Runtime, CLR),是一个可由多种语言使用的 运 ...
- AJPFX关于java中可访问控制符和非访问控制符的详细总结
1.类的修饰符分为:可访问控制符和非访问控制符两种. 可访问控制符是:公共类修饰符 public 非访问控制符有:抽象类修饰符 abstract :最终类修饰符 final 1 )公共类修饰符 pub ...
- ubuntu 下service php5-fpm restart 报错 stop: Unknown instance: 解决
问题描述: 在安装完扩展后,重启php-fpm,发现一直停止报错 stop: Unknown instance: 通过查看进程,也查询不到该主进程 解决办法: 干掉现在正在执行的进程 pkill ph ...
- js获取服务器生成并返回客户端呈现给客户的控件id的方法
var repeaterId = '<%=rpData.ClientID %>'; //Repeater的客户端IDvar rows = <%=rpData.Items.Count% ...
- C#读取web.config配置文件内容
1.对配置文件的访问. 方法一: string myConn =System.Configuration.ConfigurationManager.ConnectionStrings["sq ...
- UVA 11346 Probability 概率 (连续概率)
题意:给出a和b,表示在直角坐标系上的x=[-a,a] 和 y=[-b,b]的这样一块矩形区域.给出一个数s,问在矩形内随机选择一个点p=(x,y),则(0.0)和p点组成的矩形面积大于s的概率是多少 ...
- 洛谷 P1006 传纸条
题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是 ...
- os x 中出现message sent to deallocated instance 的错误总结
一般是程序中的某一个对象被release 了两次 一般情况下是与你定义的类型有关 这里面我的错误是吧 NSString 类型的变量的属性 设置为了 assign 了 目测与这个有关 补充object- ...
- execve - 执行程序
总览 (SYNOPSIS) #include <unistd.h> int execve (const char *filename, char *const argv [], char ...