(File IO): input:mountains.in output:mountains.out
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
Goto ProblemSet
题目描述
从农场里奶牛
B
e
s
s
i
e
Bessie
Bessie的牧草地向远端眺望,可以看到巍峨壮丽的山脉绵延在地平线上。山脉里由N座山峰
(
1
≤
N
≤
1
0
5
)
(1≤N≤10^5)
(1≤N≤105)。如果我们把
B
e
s
s
i
e
Bessie
Bessie的视野想象成xy平面,那么每座山峰都是一个底边在x轴上的三角形。山峰的两腰均与底边成
45
45
45度角,所以山峰的峰顶是一个直角。于是山峰i可以由它的峰顶坐标
(
x
i
,
y
i
)
(xi,yi)
(xi,yi)精确描述。没有两座山峰有完全相同的峰顶坐标。
B
e
s
s
i
e
Bessie
Bessie尝试数清所有的山峰,然而由于它们几乎是相同的颜色,所以如果一座山峰的峰顶在另一座山峰的三角形区域的边界上或是内部,她就无法看清。
请求出
B
e
s
s
i
e
Bessie
Bessie能够看见的不同的山峰的峰顶的数量,也就是山峰的数量。
输入
输入的第一行包含
N
N
N。以下N行每行包含
x
i
(
0
≤
x
i
≤
1
0
9
)
xi(0≤xi≤10^9)
xi(0≤xi≤109)和
y
i
(
1
≤
y
i
≤
1
0
9
)
yi(1≤yi≤10^9)
yi(1≤yi≤109),描述一座山峰的峰顶的坐标。
输出
输出
B
e
s
s
i
e
Bessie
Bessie能够分辨出的山峰的数量。
样例输入
3
4 6
7 2
2 5
样例输出
2
数据范围限制
提示
在这个例子中,
B
e
s
s
i
e
Bessie
Bessie能够看见第一座和最后一座山峰。第二座山峰被第一座山峰掩盖了。
解题思路
1.
1.
1.我们要先预处理一下等腰直角三角形的左端点和右端点,由于是等腰直角三角形,左端点等于
x
−
y
x-y
x−y 和右端点等于
x
+
y
x+y
x+y。
2.
2.
2.然后按照左端点从小到大,左端点相同右端点从大到小的方法排序。
3.
3.
3. 从左到右遍历所有的山,如果当前的山的右端点大于之前所有山的右端点,则答案
+
1
+1
+1
4.
4.
4.为什么?分两种情况讨论
(1) 当这座山的右端点不大于之前最大的右端点,那么这座山一定能被之前右端点最大的那座山覆盖,如图
(2)当这座山的右端点大于之前最大的右端点:
i
.
i.
i.在这座山之前没有能够覆盖它的山(因为这座山的右端点大于之前所有山的右端点)
i
i
.
ii.
ii.在这座山之后没有能够覆盖它的山(因为接下来的山要么左端点比这座山大,要么右端点比他小)。
代码
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
int n,x,y,maxn=-10000000,ans;
struct c{
int l,r;
}a[100010];
bool cmp(const c&q,const c&p)
{
return q.l<p.l||(q.l==p.l&&q.r>p.r);
}
int main(){
freopen("mountains.in","r",stdin);
freopen("mountains.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
a[i].l=x-y;
a[i].r=x+y;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
{
if(a[i].r>maxn)
{
ans++;
maxn=a[i].r;
}
}
printf("%d",ans);
}