正题

题目链接:https://www.luogu.com.cn/problem/CF802O


题目大意

\(n\)天每条有\(a_i\)和\(b_i\)。

每条可以花费\(a_i\)准备至多一道题,可以花费\(b_i\)打印至多一道准备好了的题。

求准备\(k\)道题最少要花费多少。

\(1\leq k\leq n\leq 5\times 10^5\)


解题思路

这也能是\(wqs\)二分是我没想到的。

物品可以分成两种,准备题目和打印题目。

然后因为这是个费用流模型所以答案肯定是下凸的。

然后这两种物品中恰好要打印\(k\)道题。

那就是\(wqs\)二分一下减去的值,然后维护的时候直接用优先队列求能搞到的最大值。

就是每次把\(a_i\)丢进去然后如果\(b_i\)就找到之前最小的一个数然后把\(b_i-mid\)丢进去(可撤销)就好了。

时间复杂度\(O(n\log W)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
#define mp(x,y) make_pair(x,y)
using namespace std;
const ll N=5e5+10;
ll n,k,a[N],b[N];
priority_queue<pair<ll,ll> >q;
signed main()
{
scanf("%lld%lld",&n,&k);
for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);
for(ll i=1;i<=n;i++)scanf("%lld",&b[i]);
ll l=0,r=2e9;
while(l<=r){
ll mid=(l+r)>>1,cnt=0,ans=0;
for(ll i=1;i<=n;i++){
q.push(mp(-a[i],0));
ll tmp=b[i]-mid-q.top().first;
if(tmp<0)ans+=tmp,q.pop(),q.push(mp(b[i]-mid,1));
}
while(!q.empty())cnt+=q.top().second,q.pop();
if(cnt==k)return printf("%lld\n",ans+k*mid)&0;
if(cnt<k)l=mid+1;
else r=mid-1;
}
return 0;
}

CF802O-April Fools‘ Problem(hard)【wqs二分,优先队列】的更多相关文章

  1. 【最小费用最大流】N. April Fools' Problem (medium)

    http://codeforces.com/contest/802/problem/N [题解] 方法一: #include<bits/stdc++.h> using namespace ...

  2. 决策单调性&wqs二分

    其实是一个还算 trivial 的知识点吧--早在 2019 年我就接触过了,然鹅当时由于没认真学并没有把自己学懂,故今复学之( 1. 决策单调性 引入:在求解 DP 问题的过程中我们常常遇到这样的问 ...

  3. 坑爹CF April Fools Day Contest题解

    H - A + B Strikes Back A + B is often used as an example of the easiest problem possible to show som ...

  4. April Fools Day Contest 2014 H. A + B Strikes Back

    H. A + B Strikes Back time limit per test 1 second memory limit per test 256 megabytes input standar ...

  5. April Fools Day Contest 2014

    April Fools Day Contest 2014 A.C.H三道题目 ============================================================= ...

  6. CF739E Gosha is hunting DP+wqs二分

    我是从其他博客里看到这题的,上面说做法是wqs二分套wqs二分?但是我好懒呀,只用了一个wqs二分,于是\(O(nlog^2n)\)→\(O(n^2logn)\) 首先我们有一个\(O(n^3)\)的 ...

  7. wqs二分

    今天模拟赛有一道林克卡特树,完全没有思路 赛后想了一想,不就是求\(k+1\)条不相交的链,使其权值之和最大嘛,傻了. 有一个最裸的\(DP\),设\(f[i][j][k]\)表示在以\(i\)为根的 ...

  8. 关于WQS二分算法以及其一个细节证明

    应用分析 它的作用就是题目给了一个选物品的限制条件,要求刚好选$m$个,让你最大化(最小化)权值, 然后其特点就是当选的物品越多的时候权值越大(越小). 算法分析 我们先不考虑物品限制条件, 假定我们 ...

  9. [总结] wqs二分学习笔记

    论文 提出问题 在某些题目中,强制规定只能选 \(k\) 个物品,选多少个和怎么选都会影响收益,问最优答案. 算法思想 对于上述描述的题目,大部分都可以通过枚举选择物品的个数做到 \(O(nk^2)\ ...

随机推荐

  1. 使用npm安装 Ant Design Vue 时报错—ant-design-vue@latest(sha1-qsf / gCIFcRYxyGmOKgx7TmHf1z4 =)seems to be corrupted.

    安装 Ant Design Vue 时报错: npm install ant-design-vue --save ant-design-vue @ latest(sha1-qsf / gCIFcRYx ...

  2. ReentrantLock可重入锁lock,tryLock的区别

    void lock(); Acquires the lock. Acquires the lock if it is not held by another thread and returns im ...

  3. idea中Jrebe热部署l的安装和激活

    安装上这个插件,就不需要再改代码后重复启动服务了,还是很方便的!!! 一.在Idea中,打开File-------->Settings-------->Plugins里面的MarketPl ...

  4. 【转】TCP的三次握手与四次挥手理解及面试题

    转自:https://blog.csdn.net/qq_38950316/article/details/81087809 序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据 ...

  5. itoa函数递归实现

    库函数中有atoi函数,用意是将字符形式输入的数据转换成数字,而库函数有没有提供一个将数字转换成字符的函数呢?答案是有的,而且功能很是强大,那就是sprintf().snprintf()格式化转换函数 ...

  6. css - 响应式

    css - 响应式 移动设备尺寸 移动设备的尺寸各不相同,大体上可以做如下划分: 768px以下的是手机屏幕 768px-991px是平板ipad屏幕 992px-1199是大平板屏幕 1200极其以 ...

  7. 基于mysql和Java Swing的简单课程设计

    摘要 现代化的酒店组织庞大.服务项目多.信息量大.要想提高效率.降低成本.提高服务质量和管理水平,进而促进经济效益,必须利用电脑网络技术处理宾馆酒店经营数据,实现酒店现代化的信息管理.本次课程设计运用 ...

  8. io中的特殊流Properties

    对于去年学习IO的时候一些代码贴上来: 初识properties,因为继承自hashtable,其中可以使用put操作: package special; import java.util.Prope ...

  9. ffplay 播放网络摄像头视频

    shell脚本如下,无须加port ffplay rtsp://cameral_ip

  10. 去除所有js,html,css代码

    <?php$search = array ("'<script[^>]*?>.*?</script>'si", // 去掉 javascript ...