原文地址:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=41
题目翻译
随着高性能图形工作站的到来,CAD(计算机协助设计)和其他领域(CAM,VLSI design)的工作效率逐渐增加。一个关于绘图的问题是消除被遮挡的线条。
你现在要写个程序帮助一个工程师绘制一个城市的天际线。为了方便编程,我们假设城市是平面的(2D的),每个建筑是正方形,坐落在同一条水平线上。每个建筑物用一个三元组
(Li,Hi,Ri)
表示,其中
Li
和
Ri
分别表示建筑物的左右边界的坐标,
Hi
表示建筑物的高度。下图中建筑物的高度可由一下的三元组表示:
(1,11,5),(2,6,7),(3,13,9),(12,7,16),(14,3,25),(19,18,22),(23,13,29),(24,4,28)
。
(图自己到原题看吧啦啦啦)
天际线的表示方法为:
(1,11,3,13,9,0,12,7,16,3,19,18,22,3,23,13,29,0)
输入
输入每行三个整数
Li,Hi,Ri
,
0≤Li≤Ri≤10,000,Li,Ri∈N
。表示一个建筑。输入按
Li
排序。
输入行数在0~5000之间。
输出
输出一行,描述了一个城市的天际线的轮廓,参考上面的示例。天际线表示为 a1,b1,a2,b2,⋯,an,bn 。其中 [ai,ai+1) 的高度为 hi 。
样例输入
1 11 5
2 6 7
3 13 9
12 7 16
14 3 25
19 18 22
23 13 29
24 4 28
样例输出
1 11 3 13 9 0 12 7 16 3 19 18 22 3 23 13 29 0
题解
其实是线段树裸题,但这题数据比较水,直接暴力就好啦。
#include <cstdio>
#include <algorithm>
#define rep(i,j,k) for(i=j;i<k;++i)
using namespace std;
int ans[10005];
int main() {
int L = 0x7fffffff, R = 0, l, h, r, i;
while (scanf("%d %d %d", &l, &h, &r) == 3) {
L = min(L, l); R = max(R, r);
rep(i,l,r) ans[i] = max(ans[i], h);
}
rep(i,L,R) if (ans[i] != ans[i - 1])
printf("%d %d ", i, ans[i]);
printf("%d %d\n", R, 0);
return 0;
}