数据结构 表 skyline

每个条形图由 3元组(Li,Hi,Ri)表示。其中,Li 和 Ri分别为条形图左右竖线的 x 坐标值,Hi 为条形图的高度。例如,上图的
8个条形图表示为:(1,11,5),(2,6,7),(3,13,9),(12,7,16),(14,3,25),(19,18,22),(23,13,29),(24,4,28)。条形图的轮廓可用轮廓向量(V1,V2,…,Vm)表示。当
i 为奇数时,Vi 表示条形图轮廓中一条竖线的 x 坐标值:当i 为偶数时,Vi 表示条形图轮廓中一条横线的高度。

例如,上图的条形图轮廓向量为(1,11,3,13,9,0,12,7,16,3,19,18,22,3,23,13,29,0)。

现在,对于给点的 n个条形图,计算其条形图轮廓。

★数据输入

第一行一个正整数 n,表示 n 个条形图(1 <= n <= 4000)。

接下来 n 行,每行有 3 个整数(Li,Hi,Ri),Li 和 Ri 分别为条形图左右竖线的 x 坐标值,Hi 为条形图的高度(-3000
<= Li,Ri<= 3000, 1 <= Hi <= 1000)。

★数据输出

输出计算出的条形图轮廓向量。

分析:
其实就是按照图示,把左边的图形转化成一个右边的图形
输出的时候判断相邻间隔是否高度不同即可
注意左右边界可以有负数,所以要加上去,否则数组越界
另外由于h <= 1000 n <= 4000 算法复杂度为O(nh) 不会超时

代码:

#include
#define LL long long
#define ms(s) memset(s, 0, sizeof(s))
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define INF 0X7fffffff
using namespace std;
const int maxn = 6e3 + 10;
int height[maxn];

// n n <= 4000
// li hi ri -3000 <= Li,Ri<= 3000, 1 <= Hi <= 1000



int main() {
     
    // freopen("in.txt", "r", stdin);
    // freopen("out.txt", "w", stdout);
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin >> n;
    ms(height);
    for(int i = 0; i < n; i++) {
     
        int l, h, r;
        cin >> l >> h >> r;
        l += 3000;
        r += 3000;
        for(int i = l; i < r; i++) {
     
            if(h > height[i])
            height[i] = h;
        }
    }
    for(int i = 0; i < maxn - 1; i++) {
     
        if(height[i] != height[i + 1]) {
     
            cout << i - 2999 << " " << height[i + 1] << " ";
        }
    }
    return 0;
}

你可能感兴趣的:(简单题)