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
",now);
return 0;
}