ZOJ4043 : Virtual Singers
将所有$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的更多相关文章
- ZOJ Monthly, June 2018 Solution
A - Peer Review Water. #include <bits/stdc++.h> using namespace std; int t, n; int main() { sc ...
- Virtual Box配置CentOS7网络(图文教程)
之前很多次安装CentOS7虚拟机,每次配置网络在网上找教程,今天总结一下,全图文配置,方便以后查看. Virtual Box可选的网络接入方式包括: NAT 网络地址转换模式(NAT,Network ...
- 窥探Vue.js 2.0 - Virtual DOM到底是个什么鬼?
引言 你可能听说在Vue.js 2.0已经发布,并且在其中新添加如了一些新功能.其中一个功能就是"Virtual DOM". Virtual DOM是什么 在之前,React和Em ...
- VR ( Virtual Reality )、AR(Augmented Reality)、MR(Mix Reality)和CR(Cinematic Reality)是什么鬼?
整个社会对虚拟现实的研究和开发源于上个世纪六十年代,计算机图形学.人机接口技术.图像处理与模式识别.多传感技术.语音处理与音响技术.高性能计算机系统.人工智能等领域在之后半个世纪取得了长足的发展为虚拟 ...
- C#中Abstract和Virtual的区别
c# 中 Abstract和Virtual比较容易混淆,都与继承有关,并且涉及override的使用.下面讨论一下二者的区别: 一.Virtual方法(虚方法) virtual 关键字用于在基类中修饰 ...
- Java/C++之 public、protected、private ; virtual & abstract
一.绪 Java/C++都是面向对象的第三代计算机高级编程语言,其本质雷同,而语法确有差异,稍不注意容易引起混淆.本文总结了一些这两门语言的差异之处,仅供参考. 二.C++ 对于C++这门语言,就其类 ...
- 初识virtual memory
一.先谈几个重要的东西 virtual memory是一个抽象概念,书上的原文是"an abstraction of main memory known as virtual memory& ...
- php编译 :virtual memory exhausted: Cannot allocate memory
有时候用vps建站时需要通过编译的方式来安装主机控制面板.对于大内存的VPS来说一般问题不大,但是对于小内存,比如512MB内存的VPS来说,很有可能会出现问题,因为编译过程是一个内存消耗较大的动作. ...
- Delphi之静态方法,虚方法virtual,动态dynamic,抽象abstract,消息
Delphi之静态方法,虚方法virtual,动态dynamic,抽象abstract,消息 http://www.cnblogs.com/zhwx/archive/2012/08/28/266055 ...
随机推荐
- Virtualbox Ubuntu 虚拟机命令行挂载共享文件夹及设置静态IP
挂载共享文件夹 参考 [1], VirtualBox/GuestAdditions [2], VirtualBox/SharedFolders 步骤 在Virtualbox 虚拟机的菜单『设备』中,点 ...
- 关闭QQ右下角弹窗小程序
关闭QQ右下角弹出的广告或新闻等. 程序没有界面,后台运行. #if defined(UNICODE) && !defined(_UNICODE) #define _UNICODE # ...
- java Socket实例
可以实现客户端与服务端双向通信,支持多客户端连接,客户端断开连接,服务端不会出现异常 服务端代码: package com.thinkgem.jeesite.modules.socketTest.de ...
- anylogic 使用
1.智能体群的用法有人会问:请问怎么给生成的两个对象赋予属性,比如在分叉的时候一个进入sink1,另一个进入sink2?我想source生成不同的实体,而且各个实体都有不同的属性,请问应该怎么设置呢? ...
- Deep Mutual Learning
论文地址: https://arxiv.org/abs/1706.00384 论文简介 该论文探讨了一种与模型蒸馏(model distillation)相关却不同的模型---即相互学习(mutual ...
- C#实现在foreach中删除集合中的元素
List<string> str = new List<string>(); str.Add( "zs"); str.Add("ls") ...
- luoguP1373 小a和uim之大逃离
DP专题 题目链接 思路 \(f[i][j][a][b][0/1]\)表示在\((i,j)\)这个格子,小a有a滴魔液,他的伙伴有b滴,上一步是小a(0)或者他的伙伴(1)吸取的魔液. (显然)数组开 ...
- 在django中uwsgi的使用,以及安装
首先了解wsgi是一个python web服务器,uwsgi实现了wsgi所有的功能,性能稳定,效率高的服务器: 1.安装uwsgi pip install uwsgi 2.配置uwsgi [uwsg ...
- 将字符串转json时,保持顺序
jo_tmp = json.loads(content.decode('utf-8'), object_pairs_hook=collections.OrderedDict)jo = json.dum ...
- json格式的中文输出显示
print json.dumps(json.loads(result),ensure_ascii=False)