题面

N

N

N 种糖果,

M

M

M 个小孩子,第

i

i

i 种糖果有

A

i

A_i

Ai​ 个,第

i

i

i 个孩子不能有超过

B

i

B_i

Bi​ 个同种类型的糖果,第

i

i

i 个孩子的糖果总数不能超过

C

i

C_i

Ci​ 。

合理分配糖果,问能分配出去的最大糖果数。

N

,

M

2

e

5

N,M\leq 2e5

N,M≤2e5 。

题解

不难想到,这就是最大流啊!

可是我们完全没法建图,更是跑不过。

那,模拟最大流?

您可以试试,不过我们这道题的正解是用最大流最小割定理

最大流等于最小割,此题最大流不好求,我们就求最小割。

一共有三类边,一类是源点连向每种糖果的边,权值为

A

i

A_i

Ai​ ,第二类是糖果和孩子之间的连边,孩子的每条入边边权都是

B

i

B_i

Bi​ ,第三类是孩子连向汇点的边,边权为

C

i

C_i

Ci​ 。

我们割掉一些边使得源点到不了汇点,可以逐个考虑。首先,糖果之间的顺序不重要,我们先把糖果按

A

i

A_i

Ai​ 从小到大排个序,割掉的边一定是个前缀。我们枚举割掉多少边,对应就已经有多少种糖果和源点不连通了,剩下的糖果,设一共有

X

X

X 种,要保证割掉第二类或第三类边后不与汇点连通。由于我们知道每种糖果与每个孩子都是存在边的,因此剩下的就是对于每个小孩子,独立地选择是割掉自己连向汇点的边(

C

i

C_i

Ci​),还是割掉从源点连过来的边(

X

B

i

X\cdot B_i

X⋅Bi​),选两者的较小值。由于决策是关于

X

X

X 单向变化的(

X

X

X 小到一定程度就不割

C

i

C_i

Ci​ 了),我们可以预处理出每个孩子决策变化时的

X

X

X 值。

时间复杂度

O

(

n

log

n

)

O(n\log n)

O(nlogn) ,基排可以

O

(

n

)

O(n)

O(n) 。

CODE

#include<set>
#include<map>
#include<stack>
#include<cmath>
#include<ctime>
#include<queue>
#include<bitset>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 200005
#define LL long long
#define DB double
#define ENDL putchar('\n')
#define lowbit(x) (-(x) & (x))
#define FI first
#define SE second
#define eps (1e-4)
#define BI bitset<MAXN>
LL read() {
LL f=1,x=0;char s = getchar();
while(s < '0' || s > '9') {if(s=='-')f = -f;s = getchar();}
while(s >= '0' && s <= '9') {x=x*10+(s-'0');s = getchar();}
return f*x;
}
void putpos(LL x) {
if(!x) return ;
putpos(x/10); putchar('0'+(x%10));
}
void putnum(LL x) {
if(!x) putchar('0');
else if(x < 0) putchar('-'),putpos(-x);
else putpos(x);
}
inline void AIput(LL x,char c) {
putnum(x); putchar(c);
}
int n,m,s,o,k;
LL a[MAXN],b[MAXN],c[MAXN];
vector<int> bu[MAXN];
int main() {
n = read();m = read();
for(int i = 1;i <= n;i ++) {
a[i] = read();
}
sort(a + 1,a + 1 + n);
LL sm = 0,sb = 0;
for(int i = 1;i <= m;i ++) b[i] = read();
for(int i = 1;i <= m;i ++) {
c[i] = read();
sm += c[i];
int le = (int)max(0ll,(LL)n - (c[i]/b[i]));
if(le <= 0) {
sm -= c[i];
sm += n*1ll*b[i];
sb += b[i];
}
else bu[le].push_back(i);
}
LL ans = sm;
for(int i = 1;i <= n;i ++) {
sm -= sb;
sm += a[i];
for(int j = 0;j < (int)bu[i].size();j ++) {
int y = bu[i][j];
sm -= c[y]; sm += (n-i) *1ll* b[y];
sb += b[y];
}
ans = min(ans,sm);
}
printf("%lld\n",ans);
return 0;
}

ARC125E - Snack (网络流)的更多相关文章

  1. plain framework 1 网络流 缓存数据详解

    网络流是什么?为什么网络流中需要存在缓存数据?为什么PF中要采用缓存网络数据的机制?带着这几个疑问,让我们好好详细的了解一下在网络数据交互中我们容易忽视以及薄弱的一块.该部分为PF现有的网络流模型,但 ...

  2. 网络流模板 NetworkFlow

    身边的小伙伴们都在愉快地刷网络流,我也来写一发模板好了. Network Flow - Maximum Flow Time Limit : 1 sec, Memory Limit : 65536 KB ...

  3. COGS732. [网络流24题] 试题库

    «问题描述:假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取m 道题组成试卷.并要求试卷包含指定类型的试题.试设计一个满足要求的组卷算法.«编程任务: ...

  4. ACM/ICPC 之 有流量上下界的网络流-Dinic(可做模板)(POJ2396)

    //有流量上下界的网络流 //Time:47Ms Memory:1788K #include<iostream> #include<cstring> #include<c ...

  5. BZOJ 3144 [Hnoi2013]切糕 ——网络流

    [题目分析] 网络流好题! 从割的方面来考虑问题往往会得到简化. 当割掉i,j,k时,必定附近的要割在k-D到k+D上. 所以只需要建两条inf的边来强制,如果割不掉强制范围内的时候,原来的边一定会换 ...

  6. bzoj3572又TM是网络流

    = =我承认我写网络流写疯了 = =我承认前面几篇博文都是扯淡,我写的是垃圾dinic(根本不叫dinic) = =我承认这道题我调了半天 = =我承认我这道题一开始是T的,后来换上真正的dinic才 ...

  7. hdu3549还是网络流

    最后一次训练模板(比较熟练了) 接下来训练网络流的建图 #include <cstdio> #define INF 2147483647 int n,m,ans,x,y,z,M,h,t,T ...

  8. 二分图&网络流&最小割等问题的总结

    二分图基础: 最大匹配:匈牙利算法 最小点覆盖=最大匹配 最小边覆盖=总节点数-最大匹配 最大独立集=点数-最大匹配 网络流: 技巧: 1.拆点为边,即一个点有限制,可将其转化为边 BZOJ1066, ...

  9. COGS743. [网络流24题] 最长k可重区间集

    743. [网络流24题] 最长k可重区间集 ★★★   输入文件:interv.in   输出文件:interv.out   简单对比时间限制:1 s   内存限制:128 MB «问题描述: «编 ...

随机推荐

  1. java提前工作、第一个程序

    java提前工作 我们学习编程肯定会 运用到相应的软件 在这里 我个人推荐 eclipse.idea 这里的软件呢 都是用我们的java编程出来的,那它也需要用java来支持他的开发环境 这里就运用到 ...

  2. Markdown的使用指南

    # Markdown学习 ------ 以下符号均是英文输入法下的 ## 1.标题 几级标题就写 几个#号 加 空格 加 标题内容 就可以 例如: ###加空格加三级标题效果如下 ### 三级标题 # ...

  3. Node.js精进(3)——流

    在 JavaScript 中,一般只处理字符串层面的数据,但是在 Node.js 中,需要处理网络.文件等二进制数据. 由此,引入了Buffer和Stream的概念,两者都是字节层面的操作. Buff ...

  4. 全国降雨侵蚀力因子R值

      数据下载链接:百度云下载链接​ 降雨侵蚀力因子其实是反应降雨对土壤侵蚀的潜在能力,就是降雨的冲刷对土壤的侵蚀效应. 在过去几天查阅文献资料的过程中,本人亲眼看见过的关于因子R的计算方法就超过30种 ...

  5. go 编程规范

    如果没有编程规范会有什么问题? 哪些地方可以需要指定规范? 非编码类规范:编码规范 非编码规范 开源规范 http://www.ruanyifeng.com/blog/2011/05/how_to_c ...

  6. CMU15445 (Fall 2019) 之 Project#3 - Query Execution 详解

    前言 经过前面两个实验的铺垫,终于到了给数据库系统添加执行查询计划功能的时候了.给定一条 SQL 语句,我们可以将其中的操作符组织为一棵树,树中的每一个父节点都能从子节点获取 tuple 并处理成操作 ...

  7. 编译kubeadm使生成证书有效期为100年

    目录 问题 编译 检查结果 问题 当我使用kubeadm部署成功k8s集群时在想默认生成的证书有效期是多久,如下所示 /etc/kubernetes/pki/apiserver.crt #1年有效期 ...

  8. Java的基础语法01

    一. 注释,标识符,关键字 书写注释是一种习惯的养成,当我们一段代码完成后,长时间没有回顾,便会产生遗忘,所以注释是给我们写代码的人看的.1.注释 //单行注释 /*多行注释*/ /**文档注释也叫文 ...

  9. 关于 CMS 垃圾回收器,你真的懂了吗?

    大家好,我是树哥. 前段时间有个小伙伴去面试,被问到了 CMS 垃圾回收器的详细内容,没答出来.实际上,CMS 垃圾回收器是回收器历史上很重要的一个节点,其开启了 GC 回收器关注 GC 停顿时间的历 ...

  10. Random的概述和基本使用与生成指定范围的随机数

    Random类用来生成随机数字,使用起来需要三个步骤 1.导包 import java.util.Random; 2.创建 Random random = new Random();//小括号中留空即 ...