洛谷 P1856 【Picture】
题目描述
N(N<5000) 张矩形的海报,照片和其他同样形状的图片贴在墙上。它们的边都是垂直的或水平的。每个矩形可以部分或者全部覆盖其他矩形。所有的矩形组成的集合的轮廓称为周长。写一个程序计算周长。
图 1 是一个有 7 个矩形的例子:
图 1.一个 7 个矩形的集合对应的轮廓为图 2 所示的所有线段的集合:
图 2. 矩形集合的轮廓
所有矩形的顶点坐标均为整数。所有的坐标都在 [-10000,10000] 的范围内,并且任何一个矩形面积都为整数。结果的值可能需要 32 位有符号整数表示。
输入
第1行: N,张贴在墙上的矩形的数目
第 2..N+1行 接下来的N行中,每行都有两个点的坐标,分别是矩形的左下角坐标和右上角坐标。每一个坐标由 X 坐标和 Y 坐标组成。
输出
只有一行,为一个非负整数,表示输入数据中所有矩形集合的轮廓长度。
样例输入
7
-15 0 5 10
-5 8 20 25
15 -4 24 14
0 -6 16 4
2 15 10 22
30 10 36 20
34 0 40 16样例输出
228来源
IOI1998
其实这道题根本不需要什么覆盖层数,直接排序+暴力就能跑出0ms(洛谷0ms,FZOJ 4ms).
我们开一个数组highest,highest[i]存储[i, i+1)这条线段上所有已经搜过的矩形的最高的上边的高度。如果现在正在搜的矩形的最低边高于已经搜过的,则中间就会有一层没贴的,于是需要计入总周长。
怎么处理能使得搜到这个矩形时,所搜到的最高的上边的高度不再会覆盖掉这个矩形呢?其实只要根据矩形的下表面从下至上的顺序排序,这样就能保证以后搜到的矩形只会往上走,最高值只会越来越高,而不会突然又搜到下面的矩形,导致重复统计了。
时间复杂度O(n log n + n × (maxx - minx) + n × (maxy - miny))。如果加入离散,则最坏时间复杂度为O(n2)。
详见代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std; //每个矩形的数据
struct data {
int lx,rx; //该矩形最左侧的横坐标与最右侧的横坐标
int ly,ry; //纵坐标同理
}; const int maxn=, maxx=;
int n;
data a[maxn+];
int highest[maxx+]; //已搜到的最高矩形上边界的高度 bool cmp_x(data x, data y) { return x.lx<y.lx; } bool cmp_y(data x, data y) { return x.ly<y.ly; } void kuaidu(int &p) {
char c; int f=; p=;
do { c=getchar(); if (c=='-') f=-; } while (c<''||c>'');
do p=p*+c-'', c=getchar(); while (c>=''&&c<='');
p*=f;
} void init() {
kuaidu(n);
for (int i=; i<=n; i++) {
kuaidu(a[i].lx); kuaidu(a[i].ly); kuaidu(a[i].rx); kuaidu(a[i].ry);
//使所有坐标变为正数
a[i].lx+=; a[i].ly+=; a[i].rx+=; a[i].ry+=;
}
} int solve_x() {
memset(highest,-,sizeof(highest));
int ans=;
//根据下底的高度,对所有矩形排序
sort(a+,a++n,cmp_x);
for (int i=; i<=n; i++)
for (int j=a[i].ly; j<a[i].ry; j++) { //处理区间[j,j+1)
//正在处理的矩形下边界高于已经搜到过的所有矩形的最高线
//所以在这个区间中多了一个矩形,答案加上上下边的长度(2)
if (highest[j]<a[i].lx) ans+=;
//更新已搜到的矩形区间[j,j+1)的最高的线的高度
if (highest[j]<a[i].rx) highest[j]=a[i].rx;
}
return ans;
} //y轴同理
int solve_y() {
memset(highest,-,sizeof(highest));
int ans=;
sort(a+,a++n,cmp_y);
for (int i=; i<=n; i++)
for (int j=a[i].lx; j<a[i].rx; j++) {
if (highest[j]<a[i].ly) ans+=;
if (highest[j]<a[i].ry) highest[j]=a[i].ry;
}
return ans;
} int main() {
init();
printf("%d\n",solve_x()+solve_y());
return ;
}
洛谷 P1856 【Picture】的更多相关文章
- 洛谷P1856 [USACO5.5]矩形周长Picture
题目背景 墙上贴着许多形状相同的海报.照片.它们的边都是水平和垂直的.每个矩形图片可能部分或全部的覆盖了其他图片.所有矩形合并后的边长称为周长. 题目描述 编写一个程序计算周长. 如图1所示7个矩形. ...
- 【洛谷3546_BZOJ2803】[POI2012]PRE-Prefixuffix(String Hash)
Problem: 洛谷3546 Analysis: I gave up and saw other's solution when I had nearly thought of the method ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP
题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...
- 洛谷P1710 地铁涨价
P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交 讨论 题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...
- 洛谷P1371 NOI元丹
P1371 NOI元丹 71通过 394提交 题目提供者洛谷OnlineJudge 标签云端评测 难度普及/提高- 提交 讨论 题解 最新讨论 我觉得不需要讨论O long long 不够 没有取 ...
- 洛谷P1538迎春舞会之数字舞蹈
题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出——“数字舞蹈 ...
随机推荐
- 关于图文转换的web工具
图文转换web服务提供的功能很简单,就是调用百度云提供的图文转换接口,将用户提供的图片中的文字识别返回给用户.具体功能就这个,但是该服务有用到以下的东西: 1.spring-boot web项目搭建 ...
- Tunnels HDU - 4856
BFS寻找每个点到其他点的最小距离 再状压DP,DP[i][j] i二进制表示每个点的到达状态,j为当前所在点 #include<iostream> #include<cstring ...
- sql数据库光标变成黑快怎么回事?
可能是因为你按到了insert键啦,你再按一下insert键应该就可以啦. 光标变成块状说明当前是覆盖模式.光标变成竖条状说明当前是插入模式.
- Cookie:解决HTTP协议无保存状态
客户端 Cookie会根据从服务器端发送的相应报文内一个叫Set-Cookie的首部字段信息,通知客户端保存Cookie.当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值 ...
- springmvc用model传值到jsp页面,el表达式引用接收不到传递过来的值
springmvc用model传值到jsp页面,el表达式引用接收不到传递过来的值 查看下controller层代码可以发现,写的是没有错误的. @RequestMapping("list. ...
- JVM(一):方法区
方法区(Method Area) 在JVM中,类型信息和类静态变量都保存在方法区中,需要注意的一点是,常量池也存放于方法区中. 类型信息包括: 1.类型的全名(The fully qualified ...
- Python3学习之路~5.13 re模块 正则表达式
re模块用于对python的正则表达式的操作. 常用正则表达式符号 字符数字: . 匹配除换行符以外的任意字符,即[^\n] \s 匹配任意空白符(如\t.\n.\r ) \S 匹配任意非空白符 \w ...
- python数据结构-如何在列表、字典、集合中根据条件筛选数据
如何在列表.字典.集合中根据条件筛选数据 问题举例: 过滤列表[1, 2, 5, -1, 9, 10]中的负数 筛选字典{“zhangsan”:97, "lisi":80, &qu ...
- ASM磁盘组剔盘、加盘实施过程
Task:从一个ASM磁盘组中剔除一块盘,加入到另一个ASM磁盘组. 环境:AIX6.1 + Oracle RAC 11.2.0.3 前期准备: 1.查看DG磁盘组空间情况: --查看DG磁盘组空间情 ...
- Java过关测验
库存物资管理系统一.背景资料:1.有一个存放商品的仓库,每天都有商品出库和入库.2.每种商品都有名称.生产厂家.型号.规格等.3.出入库时必须填写出入库单据,单据包括商品名称.生产厂家.型号.规格.数 ...