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 Problem Set - 4043 Virtual Singers(2018acm 青岛赛区热身赛)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5795 背景描述: 已经记不起来上一次做题是什么时候的事了...大概是 ...
- 远程控制virtual box虚拟机系统的三种方式
远程控制virtual box虚拟机系统的三种方式[阅读时间:5分钟] 1.使用现有的远程控制软件 2.使用SSH连接 3.使用远程桌面控制虚拟机系统 对于把虚拟机安装在寝室笔记本的人来说,能够远程控 ...
- 基类的析构函数为什么要设置成virtual
今天在一场面试过程中碰到这个问题,当时一时片刻没有反应过来,一头雾水.只记得自己回到说,是会造成内存泄露,但面试穷追猛打,一直追问为什么造成内存泄露,还给举例说明,一般情况下是不会造成内存泄露的,搞得 ...
- java.lang.NullPointerException: Attempt to invoke virtual method ‘boolean java.lang.String.equals(j
今天切正式环境出现的空指针 记录一下 下面是错误 java.lang.NullPointerException: Attempt to invoke virtual method 'boolean j ...
- 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 ...
- C#中类的继承 override virtual new的作用以及代码分析
继承中override virtual new的作用 virtual 父类中需要注明允许重写的方法: override 子类中必须显示声明该方法是重写的父类中的方法: new 子类中忽略父类的已存在的 ...
- LVS(Linux Virtual Server)三种负载均衡模型和十种调度的简单介绍
LVS(Linux Virtual Server)三种负载均衡模型和十种调度的简单介绍 LVS (Linux Virtual Server) LVS(Linux Virtual Server)其实就是 ...
- The HipHop Virtual Machine
目前Facebook已将该HipHop虚拟机开源,源代码发布在GitHub上.关于该工具的技术原理在Facebook的开发者页面上有一篇详细的文章介绍,查看这里. 如果看不到的可以看下面的转载: We ...
- Virtual PC磁盘的最佳压缩方式
随着vpc不断的使用,vpc的磁盘就会一天一天的增大,于是你试着去把那些在vpc上面的软件都删除了,可是发现体积仍然没有什么改观,我还尝试过将系统都格式化了,仍然没有什么太大的变化. 经过苦苦搜寻还是 ...
最新文章
- IDEA实用插件和技巧
- 让nginx支持php和path_info(新版本)
- 诺基亚5800WIFI设置教程
- <<science>> new and potential research areas
- 性价比超高的云服务器
- java的rserve实现_Java 使用 Rserve 实现与 R 的通信
- 自己动手写事件总线(EventBus)
- 大数据_Hbase-shell命令_(补充_hbase存数据只增加不删除_只会适时删除)---Hbase工作笔记0006
- 操作页面元素WebElement—Selenium自动化测试指南(4)
- 怎么终止linux的次序运行程序,linux – 如何按特定顺序停止systemd服务
- pthreads v3下一些坑和需要注意的地方
- MYSQL 无重复插入数据更新语法 sql一句话使insert时若主键重复则更新
- 华为路由器AAA配置与管理
- python3爬虫有道翻译_【Python3爬虫】有道翻译
- 北京电信整顿“一机双号” 通信管理局要求清理原库
- java 组织机构代码_JAVA实现社会统一信用代码校验的方法|chu
- 微博红包技术探究:架构、防刷、监控和资源调度
- 学习打卡:动手数据分析Task01
- 潇洒郎: 解决联想电脑Y430p 一碰触摸板就蓝屏
- Modbus 通讯协议 (RTU传输模式)