UVa 105|The Skyline Problem|暴力|线段树

31 篇文章 0 订阅
27 篇文章 0 订阅

原文地址: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 0LiRi10,000,Li,RiN 。表示一个建筑。输入按 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值