527D Clique Problem 判断一维线段没有两辆相交的最大线段数量
这题说的是给了n个位置 在x轴上 每个位置有一个权值为wi,然后将|xi - xj|>=wi+wj ,满足这个条件的点建一条边,计算着整张图中有多少多少个点构成的子图,使得这个子图的节点数尽量的大,这个式子进行转变 我们可以知道离i这个点为wi+xi xi-wi 范围内的点都是不可以的,那么我们就将这个n个点转化为了n条线段,那么现在的任务是计算这个n条线段两两不想交的 最大数量, 对于每条 线段有 左端点和右端点,我们将他们进行右端点排序, 然后进行每条边的判断前面k条线段的最右边那条是否与当先这条相交,如果相交,可以得知这条线段我们是不会使用的,因为我们有比他更加优的线段,在前面,如果不想交我们就把线段条数+1.记录当前最右的那条线段。
1 #include <iostream> 2 #include <algorithm> 3 #include <string.h> 4 #include <cstdio> 5 using namespace std; 6 pair<int,int> P[200005]; 7 int main() 8 { 9 int n; 10 while(scanf("%d",&n)==1){ 11 for(int i=0; i<n; i++){ 12 int x,w;scanf("%d%d",&x,&w); 13 P[i] = {x+w,x-w}; 14 } 15 sort(P,P+n); 16 int r = -2000000000; 17 int ans=0; 18 for(int i=0; i<n; i++){ 19 if(P[i].second>=r){ 20 r = P[i].first; ans++; 21 } 22 } 23 printf("%d\n",ans); 24 } 25 return 0; 26 }