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;
}

 

posted @ 2018-03-20 19:39  蒟蒻JHY  阅读(226)  评论(0编辑  收藏  举报