[CF527D]Clique Problem 题解
作者:互联网
Preface
终究是思维能力不够啊QAQ
学到了学到了。
Analysis
首先观察到连边具有双向性,考虑直接拆开绝对值,即 \(x_i - x_j\ge w_i+w_j\)
很显然,珂以把相同下标的放到一块维护,即 \(x_i-w_i\ge x_j+w_j\)
这玩意没有任何性质,我看了半天也没找出任何用巧妙的暴力或线段树求的方法。
这个时候就需要跳脱出原有的思维了,一个典型的套路是观察下这个东西像啥。
发现,将 \([x_i-w_i,x_i+w_i]\) 设为第 \(i\) 条线段的边界,那么上面这个式子的要求就是求出最多的不互相覆盖的线段个数。
这个东西珂以用贪心解决,详见 [P1803]凌乱的yyy / 线段覆盖。
时间复杂度 \(O(N\log N)\),瓶颈在排序上。
Code
超级超级短awa
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
struct node {
int l,r;
node() {
l = r = 0;
}
}a[maxn];
int n;
int main() {
scanf("%d",&n);
for(int i = 1;i <= n;++ i) {
int x,y;
scanf("%d%d",&x,&y);
a[i].l = x - y;
a[i].r = x + y;
}
sort(a + 1 , a + 1 + n , [](node x,node y){return x.r == y.r ? x.l > y.l : x.r < y.r;});
int lst = -1e9,ans = 0;
for(int i = 1;i <= n;++ i) {
if(a[i].l >= lst) {
++ ans;
lst = a[i].r;
}
}
printf("%d",ans);
return 0;
}
完结撒花✿✿ヽ(°▽°)ノ✿
标签:QAQ,int,题解,线段,ans,ge,lst,CF527D,Problem 来源: https://www.cnblogs.com/663B/p/16391677.html