11.13 NOTE

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;
}
posted @ 2025-11-13 23:57  Amiyawasdonkey  阅读(0)  评论(0)    收藏  举报