ARC125E - Snack (网络流)
题面
有
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 (网络流)的更多相关文章
- plain framework 1 网络流 缓存数据详解
网络流是什么?为什么网络流中需要存在缓存数据?为什么PF中要采用缓存网络数据的机制?带着这几个疑问,让我们好好详细的了解一下在网络数据交互中我们容易忽视以及薄弱的一块.该部分为PF现有的网络流模型,但 ...
- 网络流模板 NetworkFlow
身边的小伙伴们都在愉快地刷网络流,我也来写一发模板好了. Network Flow - Maximum Flow Time Limit : 1 sec, Memory Limit : 65536 KB ...
- COGS732. [网络流24题] 试题库
«问题描述:假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取m 道题组成试卷.并要求试卷包含指定类型的试题.试设计一个满足要求的组卷算法.«编程任务: ...
- ACM/ICPC 之 有流量上下界的网络流-Dinic(可做模板)(POJ2396)
//有流量上下界的网络流 //Time:47Ms Memory:1788K #include<iostream> #include<cstring> #include<c ...
- BZOJ 3144 [Hnoi2013]切糕 ——网络流
[题目分析] 网络流好题! 从割的方面来考虑问题往往会得到简化. 当割掉i,j,k时,必定附近的要割在k-D到k+D上. 所以只需要建两条inf的边来强制,如果割不掉强制范围内的时候,原来的边一定会换 ...
- bzoj3572又TM是网络流
= =我承认我写网络流写疯了 = =我承认前面几篇博文都是扯淡,我写的是垃圾dinic(根本不叫dinic) = =我承认这道题我调了半天 = =我承认我这道题一开始是T的,后来换上真正的dinic才 ...
- hdu3549还是网络流
最后一次训练模板(比较熟练了) 接下来训练网络流的建图 #include <cstdio> #define INF 2147483647 int n,m,ans,x,y,z,M,h,t,T ...
- 二分图&网络流&最小割等问题的总结
二分图基础: 最大匹配:匈牙利算法 最小点覆盖=最大匹配 最小边覆盖=总节点数-最大匹配 最大独立集=点数-最大匹配 网络流: 技巧: 1.拆点为边,即一个点有限制,可将其转化为边 BZOJ1066, ...
- COGS743. [网络流24题] 最长k可重区间集
743. [网络流24题] 最长k可重区间集 ★★★ 输入文件:interv.in 输出文件:interv.out 简单对比时间限制:1 s 内存限制:128 MB «问题描述: «编 ...
随机推荐
- torch.ones_like(),expand_as(),expend()等torch.repeat
https://blog.csdn.net/Arthur_Holmes/article/details/104267662 https://blog.csdn.net/weixin_39568781/ ...
- Visual Studio Installer下载速度为0处理办法
DNS改为:223.5.5.5即可. 223.5.5.5 下载完成后记得改回来.
- CSRF跨站请求伪造与XSS跨域脚本攻击讨论
今天和朋友讨论网站安全问题,聊到了csrf和xss,刚开始对两者不是神明白,经过查阅与讨论,整理了如下资料,与大家分享. CSRF(Cross-site request forgery):跨站请求伪造 ...
- Kubebuilder简介与架构
什么是Kubebuilder Kubebuilder是一个用Go原因构建Kubernetes APIs的框架,通过使用KubeBuilder,用户可以遵循一套简单的编程框架,使用CRD构建API.Co ...
- Python爬取某短视频热点
写在前面的一些话: 随着短视频的大火,不仅可以给人们带来娱乐,还有热点新闻时事以及各种知识,刷短视频也逐渐成为了日常生活的一部分.本文以一个简单的小例子,简述如何通过Pyhton依托Selenium来 ...
- 基于POM---UI测试框架
为什么会出现这个半自动化UI测试框架 我进入公司的前一个月从事的手工测试,为了提高自己的测试效率在工作时间之外写了一个半自动化的UI测试(害怕手工测试做久了,忘记自己还学过软件开发), 为什么我把它叫 ...
- PTA(BasicLevel)-1016 部分A+B
一.问题定义 正整数 a的"Da(为 1 位整数)部分"定义为由a中所有Da组成的新整数Pa.例如:给定8,Da = 6,则a的"6 部分"Pa是66,因为a ...
- Graph Neural Networks:谱域图卷积
以下学习内容参考了:1,2, 0.首先回忆CNN,卷积神经网络的结构和特点 处理的数据特征:具有规则的空间结构(Euclidean domains),都可以采用一维或者二维的矩阵描述.(Convolu ...
- Calendar类介绍_获取对象的方式和Calendar类的常用成员方法
java.util.Calendar类:日历类 Calendar类是一个抽象类,里边提供了很多操作日历字段的方法(YEAR.MONTH.DAY_OF_MONTH.HOUR ) Calendar类无法直 ...
- 数学工具类Math
概述 java.lang.Math 类包含用于执行基本数学运算的方法,如初等指数.对数.平方根和三角函数.类似这样的工具 类,其所有方法均为静态方法,并且不会创建对象,调用起来非常简单 基本运算的方法 ...