【USACO 2019 January Silver】Mountain View题解

题目:

题目描述
从农场里奶牛Bessie的牧草地向远端眺望,可以看到巍峨壮丽的山脉绵延在地平线上。山脉里由N座山峰(1≤N≤10^5)。如果我们把Bessie的视野想象成xy平面,那么每座山峰都是一个底边在x轴上的三角形。山峰的两腰均与底边成45度角,所以山峰的峰顶是一个直角。于是山峰i可以由它的峰顶坐标(xi,yi)精确描述。没有两座山峰有完全相同的峰顶坐标。
Bessie尝试数清所有的山峰,然而由于它们几乎是相同的颜色,所以如果一座山峰的峰顶在另一座山峰的三角形区域的边界上或是内部,她就无法看清。
请求出Bessie能够看见的不同的山峰的峰顶的数量,也就是山峰的数量。
输入
输入的第一行包含N。以下N行每行包含xi(0≤xi≤109)和yi(1≤yi≤109),描述一座山峰的峰顶的坐标。

输出
输出Bessie能够分辨出的山峰的数量。

样例输入
3
4 6
7 2
2 5
样例输出
2

提示
在这个例子中,Bessie能够看见第一座和最后一座山峰。第二座山峰被第一座山峰掩盖了。

思路:

这可能类似以前的 一道题,那里我用的是STL模板,其实也能用堆做,但这都是优化,而这次这道题没法优化,可能数据太水,O(n^2)竟然过了。

我的方法是先以高度排序(降序),然后依次遍历一遍,如果没被前面的山覆盖,那就ans++。

可能有人会问,为什么要排序呢?我们可以想一想,高的山一定不可能被小的山覆盖,所以从高往低,可以算是一种优化吧?

可能又有人会问,如何判断它是否被前面的山覆盖呢?很简单,遍历比它高的山且那座山没被覆盖,如果y1-abs(x-x1)>y,那么x,y这座山就被覆盖了。

你可能感兴趣的:(题解)