link: https://loj.ac/problem/6307
最大团转补图的独立集,这样的话只有r[x]<l[y]或者r[y]<l[x],x和y才能连边,所以排序之后乱搞就行了。
需要注意的一点是,如果一个点的l==r的话,需要特殊建点。
#include<bits/stdc++.h>
#define ll long long
const int maxn=200005;
using namespace std;
struct node{int pos,con,num;bool operator <(const node &u)const{return pos==u.pos?con>u.con:pos<u.pos;}
}a[maxn*2];
int n,X,W,f[maxn],now;
int main(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d%d",&X,&W);if(W){a[i]=(node){X-W,0,i};a[i+n]=(node){X+W,1,i};}else a[i+n]=(node){X,-1,i};}n<<=1,sort(a+1,a+n+1);for(int i=1;i<=n;i++)if(a[i].con) if(a[i].con==1) now=max(now,f[a[i].num]);else f[a[i].num]=now+1,now++;else f[a[i].num]=now+1;printf("%d\n",now);return 0;
}