题面
坐标轴上有n个点,每个点有一个权值。第i个点的坐标是 xi ,权值是 wi 。现在对这些点建图。对于点对 (i,j) ,如果 \(|xi−xj|≥wi+wj\) ,那么就给第i个点和第j个点之间连一条边。
问建好的图中最大团有几个点。
\(1≤n≤200000\)
100
由\(|xi−xj|≥wi+wj\),我们知道可以把每个点,看做一条\([x_i-w_i,x_i+w_i]\)的线段。
那么就变成了找出最多条互不相交的线段。
那么就可以把线段按右端点排序后,贪心一波就好了。
Code
#include<bits/stdc++.h>
#define fo(i,x,y) for(int i=x;i<=y;i++)
using namespace std;
const int inf=0x7fffffff;
const int maxn=200007;
int n;
pair<int,int> a[maxn];
int main(){
scanf("%d",&n);
fo(i,1,n){
int j,k;
scanf("%d%d",&j,&k);
a[i]=make_pair(j+k,j-k);
}
sort(a+1,a+1+n);
int ans=0,j=-inf;
fo(i,1,n)
if (a[i].second>=j){
j=a[i].first;
ans++;
}
printf("%d",ans);
return 0;
}