[CF527D] Clique Problem

数轴上有n 个点,第i 个点的坐标为xi,权值为wi。两个点i,j之间存在一条边当且仅当 abs(xi-xj)>=wi+wj。 你需要求出这张图的最大团的点数。

Solution

把每个点看作以 ((x_i,0)) 为圆心,半径为 (r_i) 的圆

那么如果不相交就有边相连

干脆看作线段吧,所以就是求最大不相交线段数

这就是一个很基础的贪心,以右端点为第一关键字,左端点为第二关键字 sort

然后“能取就取”即可

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 400005;

int n,x[N],w[N];

struct interval {
    int l,r;
    bool operator < (const interval &b) const {
        return r < b.r;
    }
} I[N];

signed main() {
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++) cin>>x[i]>>w[i];
    for(int i=1;i<=n;i++) {
        I[i].l=x[i]-w[i];
        I[i].r=x[i]+w[i];
    }
    sort(I+1,I+n+1);
    int pos=-1e9,ans=0;
    for(int i=1;i<=n;i++) {
        if(I[i].l>=pos) {
            ++ans;
            pos=I[i].r;
        }
    }
    cout<<ans;
}
原文地址:https://www.cnblogs.com/mollnn/p/12292947.html