527D Clique Problem 判断一维线段没有两辆相交的最大线段数量

时间:2023-03-09 16:56:10
527D Clique Problem 判断一维线段没有两辆相交的最大线段数量

这题说的是给了n个位置 在x轴上 每个位置有一个权值为wi,然后将|xi - xj|>=wi+wj ,满足这个条件的点建一条边,计算着整张图中有多少多少个点构成的子图,使得这个子图的节点数尽量的大,这个式子进行转变 我们可以知道离i这个点为wi+xi xi-wi 范围内的点都是不可以的,那么我们就将这个n个点转化为了n条线段,那么现在的任务是计算这个n条线段两两不想交的 最大数量, 对于每条 线段有 左端点和右端点,我们将他们进行右端点排序, 然后进行每条边的判断前面k条线段的最右边那条是否与当先这条相交,如果相交,可以得知这条线段我们是不会使用的,因为我们有比他更加优的线段,在前面,如果不想交我们就把线段条数+1.记录当前最右的那条线段。

 #include <iostream>
#include <algorithm>
#include <string.h>
#include <cstdio>
using namespace std;
pair<int,int> P[];
int main()
{
int n;
while(scanf("%d",&n)==){
for(int i=; i<n; i++){
int x,w;scanf("%d%d",&x,&w);
P[i] = {x+w,x-w};
}
sort(P,P+n);
int r = -;
int ans=;
for(int i=; i<n; i++){
if(P[i].second>=r){
r = P[i].first; ans++;
}
}
printf("%d\n",ans);
}
return ;
}