每个条形图由 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<bits/stdc++.h>
#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;
}