首页 > 其他分享 >CF1802D题解

CF1802D题解

时间:2023-03-10 15:33:43浏览次数:62  
标签:ch min int 题解 maxl ans minr CF1802D

CF1802D题解

传送门

更好的阅读体验

简化题意:有 n 个商店,每个商店卖 a,b 两种商品,价格分别为 \(a_i,b_i\),你需要在每个商店买一个商品,并且不能在所有商店都买同一种商品,最小化买的最贵的 a 商品和买的最贵的 b 商品的价格差的绝对值。

思路:首先观察到数据范围是 \(n\leqslant5\times10^5\),也是就感觉像个贪心,于是就考虑枚举某一种商品的最大值然后计算答案。我们不妨枚举买的 a 商品的最大值。我们将所有商店按 \(a_i\) 从大到小排序,钦定当前的 \(a_i\) 为 a 商品的最大值,我们发现这时有 2 类 b 。首先是满足 \(a_j>a_i\)的 \(b_j\),接着是所有满足 \(a_j\leqslant a_i\) 的 \(b_j\),然后是 \(a_j<a_i\) 的 \(b_j\)。对于第一类,它们是必须选的,我们记最大值为 \(maxb\) 。对于第二类,会做贡献的肯定是最大的小于等于 \(a_i\) 的 \(b_j\) 和最小的大于等于 \(a_i\) 的 \(b_j\) ,记为 \(maxl\) 和 \(minr\),需注意的是如果没有其他的 \(a_j=a_i\) ,那不能算上对应的 \(b_j\) 的贡献。同时,因为 \(maxl,minr\) 最多只会有一个被选,那么我们也无需担心我们没有购买任何一个 a 商品。

然后我们考虑如何计算答案。首先,如果 \(maxb\geqslant a_i\),这时无论怎么买答案都不会小于 \(maxb-a_i\) ,于是可以直接更新答案。如果 \(maxb<a_i\) 那么当前答案就是 \(\min(a_i-maxl,minr-a_i)\),再更新答案即可。

代码实现的时候,因为是从大到小考虑 \(a_i\),那么 \(maxb\) 显然可以直接维护,然后对于 \(a_j=a_i\) 的部分可以直接扫一遍,剩下部分的可以考虑用 multiset 来查前驱后继,这样就做完了。时间复杂度 \(O(n\log n)\),空间复杂度 \(O(n)\)。

代码:

#include<bits/stdc++.h>
using namespace std;
inline int read(){
    int s=0;
    char ch=getchar();
    while(ch<'0'||ch>'9')ch=getchar();
    while(ch>='0'&&ch<='9')s=s*10+(ch^48),ch=getchar();
    return s;
}
const int N=500501;
int T,n;
struct node{
    int a,b;
}t[N];
multiset<int>s;
inline bool cmp(node a,node b){
    return a.a<b.a;
}
int main(){
    T=read();
    while(T--){
        s.clear();
        n=read();
        for(int i=1;i<=n;i++)t[i].a=read(),t[i].b=read(),s.insert(t[i].b);
        sort(t+1,t+n+1,cmp);
        int maxn=-1e9,ans=1e9;
        t[n+1].a=t[0].a=-1;
        for(int i=n;i>=1;i--){
            if(t[i].a==t[i+1].a)continue;
            int j=i;
            while(t[j-1].a==t[i].a)j--;
            if(maxn>=t[i].a){
                ans=min(ans,maxn-t[i].a);
                break;
            }
            int cur,maxl=-1e9,minr=2e9+1;
            for(int k=j;k<=i;k++){
                s.erase(s.find(t[k].b));
            }
            if(j!=i){
                for(int k=j;k<=i;k++){
                    if(t[k].b<=t[i].a&&t[k].b>maxl)maxl=t[k].b;
                    if(t[k].b>t[i].a&&t[k].b<minr)minr=t[k].b;
                }
            }
            if(s.size()){
                set<int>::iterator it=s.lower_bound(t[i].a);
                if(it!=s.end()){
                    minr=min(minr,*it);
                }
                if(it!=s.begin())it--,maxl=max(maxl,*it);
            }
            maxl=max(maxl,maxn);
            cur=min(t[i].a-maxl,minr-t[i].a);
            ans=min(ans,cur);
            for(int k=j;k<=i;k++)maxn=max(maxn,t[k].b);
        }
        printf("%d\n",ans);
    }
    return 0;
}

标签:ch,min,int,题解,maxl,ans,minr,CF1802D
From: https://www.cnblogs.com/Xttttr/p/17203514.html

相关文章

  • Python - Crypto 导入失败问题解决记录
    python3.7Mac安装psycopg2$pipinstallpsycopg2...Error:pg_configexecutablenotfound....出现报错:Error:pg_configexecutablenotfound.解决参考:h......
  • P5752 [NOI1999] 棋盘分割题解
    本文来自我的洛谷博客。本题解力求使用清晰易懂的图片和文字,讲解最简洁的道理。请大家耐心地看完,注意要结合图片一起哦~~2022-8-24更改了格式与错别字2022-8-28更改......
  • python工具jupyternotebook页面打开空白问题解决方法
    jupyternotebook页面打开空白问题解决方法下载anaconda自带的jupyternotebook找到这个配置文件C:\Users\Administrator.jupyter\jupyter_notebook_config.py打开找......
  • P7712 [Ynoi2077] hlcpq 题解
    虚式优化建图题。首先有一个很显然的暴力,对于两条相交的线段连一条边,然后跑割点。这个暴力的问题在于边与点的时间复杂度相差过大,无论是空间还是时间都无法承受,所以可以......
  • CF1713F 题解
    题意传送门给出一个从\(1\)到\(n\)的数组\(a\),有一个从\(0\)开始标号的大小为\((n+1)\times(n+1)\)的矩阵\(b\),通过以下方式生成:对于\(0\lei\len\),\(b_{i......
  • 江南信息学2023第三周练习20230310 题解
    比赛链接1001:三个数的最大值条件判断,如判断a最大就是a>=b&&a>=c,以此类推1002:星期几取余,n%7结果是0则是周一,是1则周二,以此类推1003:奇偶分家设两个求和变量sum1,sum2......
  • ABC292F题解
    首先先钦定\(a\leb\),否则交换一下就行。方法1:二分答案。容易发现,答案至少为\(a\),并且用左下角为一个顶点一定不会更劣,并且另外两个点一定都在线段上(否则可以调整)。我们......
  • CF207C3 Game with Two Trees 题解
    脑子不够,科技来凑。不过好像也没有用多么高级的科技……首先这个题目很坏,它让你翻转\(S_{t_2}\)。即从\(t_2\)某个节点往下走到另一个节点的路径所表示的字符串。这个......
  • Python自动化登录验证码问题解决
     1.测试环境中通常解决验证码问题的方法 在测试环境中我们通常通过各种手段来逃避或者获得验证,而这些手段主要是要求开发者在开发的时候留有一定的后门。下面简述几种......
  • 【题解】ARC157 A-D
    因为有的题代码没写出来,所以代码就先咕咕咕了。A.XXYYX题目分析:可以发现每一个XY必然伴随着出现一次YX,当然可能会有一个XY没有伴随的YX的。而且若必须存在XX......