CF1801B题解

1|0CF1801B题解

传送门

更好的阅读体验

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

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

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

代码实现的时候,因为是从大到小考虑 ai,那么 maxb 显然可以直接维护,然后对于 aj=ai 的部分可以直接扫一遍,剩下部分的可以考虑用 multiset 来查前驱后继,这样就做完了。时间复杂度 O(nlogn),空间复杂度 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; }

__EOF__

本文作者Xttttr
本文链接https://www.cnblogs.com/Xttttr/p/17203514.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Xttttr  阅读(46)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示