【USACO19Jan-S】山景Mountain View
Description
从农场里奶牛Bessie的牧草地向远端眺望,可以看到巍峨壮丽的山脉绵延在地平线上。山脉里由N座山峰(1≤N≤10^5)。如果我们把Bessie的视野想象成xy平面,那么每座山峰都是一个底边在x轴上的三角形。山峰的两腰均与底边成45度角,所以山峰的峰顶是一个直角。于是山峰i可以由它的峰顶坐标(xi,yi)精确描述。没有两座山峰有完全相同的峰顶坐标。 Bessie尝试数清所有的山峰,然而由于它们几乎是相同的颜色,所以如果一座山峰的峰顶在另一座山峰的三角形区域的边界上或是内部,她就无法看清。
请求出Bessie能够看见的不同的山峰的峰顶的数量,也就是山峰的数量。
Input
输入的第一行包含N。
以下N行每行包含xi(0≤xi≤109)和yi(1≤yi≤109),描述一座山峰的峰顶的坐标。
Output
输出Bessie能够分辨出的山峰的数量。
Sample Input
3
4 6
7 2
2 5
Sample Output
2
Hint
【样例说明】在这个例子中,Bessie能够看见第一座和最后一座山峰。第二座山峰被第一座山峰掩盖了。
思路
- 将山峰转化为山底的左右端点,题目转化为求不被包含的线段数量
代码
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=100005;
int n,L,R,ans;
struct fdfdfd{int left,right;}e[maxn];
bool cmp(fdfdfd a,fdfdfd b){return a.left==b.left?a.right>b.right:a.left<b.left;}
int main()
{
scanf("%d",&n);
for(int i=1,x,y;i<=n;++i) scanf("%d%d",&x,&y),e[i].left=x-y,e[i].right=x+y;
sort(e+1,e+n+1,cmp);
L=e[1].left; R=e[1].right; ans=1;
for(int i=2;i<=n;++i)
{
if(e[i].left>=L&&e[i].right<=R) continue;
++ans; L=e[i].left; R=e[i].right;
}
cout<<ans<<'\n';
return 0;
}