将所有$A$和$B$混在一起排序,那么每个$B$要匹配一个$A$,从左往右依次考虑每个数:

如果是一个$B$:

  • 如果左边没有多余的$A$,那么将其放入堆$q_C$中,表示这个$B$还未匹配。
  • 否则选择左边代价最小的$A$和这个$B$进行匹配,并把代价取反,加上这个$B$往右匹配的贡献后放入堆$q_B$中,表示未来某个$A$抢走这个$B$的代价,即费用流的反悔操作。

如果是一个$A$:

  • 如果$q_C$非空,那么将该$A$直接与$q_C$中代价最小的$B$进行匹配即可。
  • 否则如果$q_B$非空且抢走之前的某个$B$更优,那么抢走之前的$B$,并把这个代价取反,加上这个$A$往右匹配的贡献后放入堆$q_A$中,同理表示费用流的反悔操作。
  • 否则说明这个$A$暂时不需要和左边某个$B$进行匹配,将其放入待命区,也就是堆$q_A$中即可。

显然每个数只会进行$O(1)$次堆操作,故时间复杂度为$O((n+m)\log (n+m))$。

#include<cstdio>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
int Case,n,m,i,ce,x;ll ans;
struct E{int x,y;E(){}E(int _x,int _y){x=_x,y=_y;}}e[200010];
inline bool cmp(const E&a,const E&b){return a.x<b.x;}
int main(){scanf("%d",&Case);while(Case--){priority_queue<ll,vector<ll>,greater<ll> >A,B,C;scanf("%d%d",&n,&m);ce=0;while(n--){scanf("%d",&x);e[++ce]=E(x,0);}while(m--){scanf("%d",&x);e[++ce]=E(x,1);}sort(e+1,e+ce+1,cmp);ans=0;for(i=1;i<=ce;i++){ll x=e[i].x;if(e[i].y==0){if(!C.empty()){ll t=C.top();C.pop();ans+=x+t;}else if(!B.empty()){ll t=B.top();if(t+x<0){B.pop();ans+=x+t;A.push(-t-x-x);}else A.push(-x);}else A.push(-x);}else{if(!A.empty()){ll t=A.top();A.pop();ans+=x+t;B.push(-t-x-x);}else C.push(-x);}}printf("%lld\n",ans);}
}

  

ZOJ4043 : Virtual Singers相关推荐

  1. ZOJ Problem Set - 4043 Virtual Singers(2018acm 青岛赛区热身赛)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5795 背景描述: 已经记不起来上一次做题是什么时候的事了...大概是 ...

  2. 远程控制virtual box虚拟机系统的三种方式

    远程控制virtual box虚拟机系统的三种方式[阅读时间:5分钟] 1.使用现有的远程控制软件 2.使用SSH连接 3.使用远程桌面控制虚拟机系统 对于把虚拟机安装在寝室笔记本的人来说,能够远程控 ...

  3. 基类的析构函数为什么要设置成virtual

    今天在一场面试过程中碰到这个问题,当时一时片刻没有反应过来,一头雾水.只记得自己回到说,是会造成内存泄露,但面试穷追猛打,一直追问为什么造成内存泄露,还给举例说明,一般情况下是不会造成内存泄露的,搞得 ...

  4. java.lang.NullPointerException: Attempt to invoke virtual method ‘boolean java.lang.String.equals(j

    今天切正式环境出现的空指针 记录一下 下面是错误 java.lang.NullPointerException: Attempt to invoke virtual method 'boolean j ...

  5. Virtual host / experienced an error on node rabbit@wohu-rabbit and may be inaccessible

    RabbitMQ 如下错误: Virtual host / experienced an error on node rabbit@wohu-rabbit and may be inaccessibl ...

  6. C#中类的继承 override virtual new的作用以及代码分析

    继承中override virtual new的作用 virtual 父类中需要注明允许重写的方法: override 子类中必须显示声明该方法是重写的父类中的方法: new 子类中忽略父类的已存在的 ...

  7. LVS(Linux Virtual Server)三种负载均衡模型和十种调度的简单介绍

    LVS(Linux Virtual Server)三种负载均衡模型和十种调度的简单介绍 LVS (Linux Virtual Server) LVS(Linux Virtual Server)其实就是 ...

  8. The HipHop Virtual Machine

    目前Facebook已将该HipHop虚拟机开源,源代码发布在GitHub上.关于该工具的技术原理在Facebook的开发者页面上有一篇详细的文章介绍,查看这里. 如果看不到的可以看下面的转载: We ...

  9. Virtual PC磁盘的最佳压缩方式

    随着vpc不断的使用,vpc的磁盘就会一天一天的增大,于是你试着去把那些在vpc上面的软件都删除了,可是发现体积仍然没有什么改观,我还尝试过将系统都格式化了,仍然没有什么太大的变化. 经过苦苦搜寻还是 ...

最新文章

  1. IDEA实用插件和技巧
  2. 让nginx支持php和path_info(新版本)
  3. 诺基亚5800WIFI设置教程
  4. <<science>> new and potential research areas
  5. 性价比超高的云服务器
  6. java的rserve实现_Java 使用 Rserve 实现与 R 的通信
  7. 自己动手写事件总线(EventBus)
  8. 大数据_Hbase-shell命令_(补充_hbase存数据只增加不删除_只会适时删除)---Hbase工作笔记0006
  9. 操作页面元素WebElement—Selenium自动化测试指南(4)
  10. 怎么终止linux的次序运行程序,linux – 如何按特定顺序停止systemd服务
  11. pthreads v3下一些坑和需要注意的地方
  12. MYSQL 无重复插入数据更新语法 sql一句话使insert时若主键重复则更新
  13. 华为路由器AAA配置与管理
  14. python3爬虫有道翻译_【Python3爬虫】有道翻译
  15. 北京电信整顿“一机双号” 通信管理局要求清理原库
  16. java 组织机构代码_JAVA实现社会统一信用代码校验的方法|chu
  17. 微博红包技术探究:架构、防刷、监控和资源调度
  18. 学习打卡:动手数据分析Task01
  19. 潇洒郎: 解决联想电脑Y430p 一碰触摸板就蓝屏
  20. Modbus 通讯协议 (RTU传输模式)

热门文章

  1. 入手评测 i7 13700和13700K的区别 i713700和i713700K差距
  2. 《小目标目标检测的解决方法及方式》
  3. C#中的cs0116Error
  4. 【Ruby】can‘t modify frozen string
  5. 国家自然科学基金重点项目启动暨软件定义网络 技术前瞻研讨会
  6. 华为超越三星拿下第一!2019年全球5G手机出货量榜单揭晓
  7. 【TINY4412】U-BOOT移植笔记:(9)SD卡启动U-BOOT
  8. 蛋糕瓜分殆尽 谁会成为下一个手游造富的加速器?
  9. VLDB2017论文阅读-Cohort Query Processing
  10. 求职面试礼仪及注意事项