P9350 [JOI 2023 Final] 宣传 2 / Advertisement 2
题目传送门
思路
通过题目给出的式子,我们可以推出,对于一个贡献,需要满足的条件是:
\[E_i-X_i \ge E_j-X_j 或 E_i+X_i \ge E_j+X_j
\]
那我们就可以发现,我们可以考虑 \(E_i-X_i\) 和 \(E_i+X_i\) 与其它点之间的关系来计算答案。
有一个好理解的方法:考虑将 \(E_i-X_i\) 作为横坐标,\(E_i+X_i\) 作为纵坐标放到直角坐标系上,则这个点的有效覆盖则是这个点与原点连成的矩形。
那就很好做了。按照坐标从大到小排序,贪心地从最高的点往下扫,如果有某一个点的横坐标大于已知的最大横坐标,则这个点没有被覆盖到,需要在这个点上扩展,则这个点对答案有 1 个贡献。
总结
关于式子
可以把题目给定的式子化简,得到其他的约束方案,那么就可以使用常规方法来解题了(比如二维偏序问题之类的)
Code
#include<bits/stdc++.h>
#define Iseri namespace
#define Nina std
#define Kawaragi int
#define Momoka main
#define ls(p) (p<<1)
#define rs(p) (p<<1|1)
#define ll long long
#define ull unsigned long long
#define pii pair<ll,ll>
const int maxn=500005;
const ll inf=1e18;
const int mod=1e9+7;using Iseri Nina;inline ll read(){ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}return x*f;
}//============================================================struct node{ll x,y;friend bool operator<(node a,node b){if(a.y==b.y)return a.x>b.x;else return a.y>b.y;}
}a[maxn];ll n,x,e,ans;Kawaragi Momoka(){n=read();for(ll i=1;i<=n;i++){x=read(),e=read();a[i].x=e-x,a[i].y=e+x;}sort(a+1,a+1+n);ll mx=-inf;for(ll i=1;i<=n;i++){if(a[i].x>mx)ans++;mx=max(mx,a[i].x);}printf("%lld\n",ans);return 0;
}