CF1801B题解

传送门

更好的阅读体验

简化题意:有 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;
}

CF1801B题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

  10. JSOI2016R3 瞎BB题解

    题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...

随机推荐

  1. python与c++区别

    1 都是面向对象编程,但是python是脚本语言,无需main函数 2 python不需要引用库,前不要定义类型,后不要: 列表可以用-x,表示倒数第几个,不能用a++ a = [1, 2, 3, 4 ...

  2. web自动化测试python+selenium----API

    import time from selenium import webdriver # 启动谷歌浏览器,开启与浏览器之间的会话 driver = webdriver.Chrome() # 访问一个网 ...

  3. react+antd upload实现图片宽高、视频宽高尺寸校验

    图片宽高校验方法: // 上传图片尺寸限制 const checkIconWH = (file: any) => { return new Promise<void>(functio ...

  4. Debug --> 使用USTC-TK2016工具对USTC-TFC2016数据集进行处理

    文件介绍: https://blog.csdn.net/u010916338/article/details/86511009?spm=1001.2101.3001.6661.1&utm_me ...

  5. Jmeter一、开源软件的崛起

    一.jmeter自身特点: 1.开源,轻量级,更适合自动化和持续集成. 2.学习难度大. 3.资料少.多英文. 二.性能测试工具选型的原则 1.成本: a.工具成本 b.学习成本 2.通信协议: a. ...

  6. Layui分页与springboots

    service.java public List<Menu> listAllMenuPage(PageData pd) throws Exception{ List<Menu> ...

  7. nrm ls报错及npm镜像站点测速、切换

    报错截图: 解决方法: 1.win键,搜索powershell,点击"以管理员身份运行" 2.粘贴下面命令,回车,敲y,回车 set-ExecutionPolicy RemoteS ...

  8. 网易二面-Arthas的底层原理

    众所周知,阿里开源的Arthas已经成为Java开发中调优的基本工具,其功能在于监控JVM运行情况,并对CPU.内存状况生成报告或者是火炬图. 从JDK5开始,java.lang.instrument ...

  9. c++结对编程

    || |:--|:--| |Github项目|Github地址 |结对伙伴|伙伴地址1伙伴地址2 PSP表格 ||| |:--|:--|:--|:--| |PSP2.1|Personal Softwa ...

  10. vue移动端登录与登录保持

    成品效果 首先进入首页点击右下角个人中心,若状态为登录中则进入个人中心页面,否则进入登录页 实现步骤 首先完成静态的登录页与个人中心页面 登录页 <template> <div cl ...