Loj #6307. 「雅礼国庆 2017 Day1」Clique
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; }
我爱学习,学习使我快乐