AtCoder Beginner Contest 332 G. Not Too Many Balls(最大流转最小割 dp)

题目

n(n<=500)种球,第i种有ai(0<=ai<=1e12)个球,

m(m<=5e5)个盒子,第j个能放bj(0<=bj<=1e12)个球

特别地,第j个盒子最多能放i*j个第i种球

求m个盒子能放的最多的球的总数

思路来源

官方题解

题解

显然是一个最大流模型,超级源点s到超级汇点的流量t,

由于最小割=最大流,可以考虑最后这个图,割完之后长什么样

比如左侧1、3记为集合P含于S,右侧点2记为集合Q含于S,

那么,记左侧集合非P含于T,右侧集合非Q含于T

那么,最小割的边集的构成,由三部分组成:

1. 超级源点s与集合非P之间的边,即左侧属于t的点,断开与s的边

2. 集合Q与超级汇点t之间的边,即右侧属于s的点,断开与t的边

3. 左侧集合P与右侧集合非Q之间的边,左侧属于s的点,右侧属于t的点,断开左右点之间的边

由于边是有向的,

所以无需断开左侧属于t的点和右侧属于s的点之间的边,

因为从上游流量就已经切断了

然后就是对官方题解的一些补充说明吧,

最小割的代价由三部分组成,

形如cost=\sum f(i)+\sum u(i) \sum v(j) + \sum g(j)

所以枚举k=\sum u(i),也就是左侧属于S集合的i之和,

这样可以通过dp,O(n^3)求得\sum u(i)

也就是属于S集合i之和固定时,不属于S集合的Ai之和的最小值

而后面两坨,k固定时,答案之和j有关,

可以任意划分,将一部分划给S集合,另一部分划给T集合,

并且划给S集合的每个点贡献是j*k,划给T集合的每个点贡献是B[j],

使得这两部分之和最小,那么考虑某一个点,自然是哪个小划给哪边,

所以每个点贡献是min(j*k,B[j])

由j*k>B[j],解得k>=B[j]/j,所以枚举k的时候,每个点从S换到T的操作只会发生一次

记录一下这个翻转的时机,即可一边枚举k一边实现对贡献的统计,

这部分复杂度O(n^2+m)

总复杂度O(n^3+n^2+m)

代码

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
typedef long long ll;
typedef double db;
typedef pair<ll,int> P;
#define fi first
#define se second
#define pb push_back
#define dbg(x) cerr<<(#x)<<":"<<x<<" ";
#define dbg2(x) cerr<<(#x)<<":"<<x<<endl;
#define SZ(a) (int)(a.size())
#define sci(a) scanf("%d",&(a))
#define scll(a) scanf("%lld",&(a))
#define pt(a) printf("%d",a);
#define pte(a) printf("%d\n",a)
#define ptlle(a) printf("%lld\n",a)
#define debug(...) fprintf(stderr, __VA_ARGS__)
const int N=505,M=5e5+10,S=N*(N+1)/2;
const ll INF=0x3f3f3f3f3f3f3f3fll;
int n,m;
ll a[N],b[M],dp[N][S],ans,sum,sum2;
vector<int>flip[S];
void upd(ll &x,ll y){x=min(x,y);
}
int main(){sci(n),sci(m);rep(i,1,n)scll(a[i]);rep(i,1,m)scll(b[i]);memset(dp,INF,sizeof dp);dp[0][0]=0;rep(i,0,n-1){int up=i*(i+1)/2,v=i+1;rep(j,0,up){upd(dp[i+1][j+v],dp[i][j]);upd(dp[i+1][j],dp[i][j]+a[i+1]);}}int lim=n*(n+1)/2;rep(j,1,m){//先认为都是j*k,再翻到b[j]ll v=b[j]/j;if(v<=lim)flip[v].pb(j);sum+=j;}ans=8e18;rep(j,0,lim){ans=min(ans,dp[n][j]+1ll*sum*j+sum2);for(auto &v:flip[j]){sum-=v;sum2+=b[v];}}printf("%lld\n",ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/283451.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于“Python”的核心知识点整理大全26

目录 10.3.9 决定报告哪些错误 10.4 存储数据 10.4.1 使用 json.dump()和 json.load() number_writer.py number_reader.py 10.4.2 保存和读取用户生成的数据 对于用户生成的数据&#xff0c;使用json保存它们大有裨益&#xff0c;因为如果不以某种方式进行存储&#xf…

CyclicBarrier学习一

一、定义 CyclicBarrier 字面意思回环栅栏&#xff08;循环屏障&#xff09;&#xff0c;通过它可以实现让一组线程等待至某个状态&#xff08;屏障点&#xff09;之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后&#xff0c;CyclicBarrier可以被重用。 CyclicB…

C++入门【9-C++循环】

C 循环 有的时候&#xff0c;可能需要多次执行同一块代码。一般情况下&#xff0c;语句是顺序执行的&#xff1a;函数中的第一个语句先执行&#xff0c;接着是第二个语句&#xff0c;依此类推。 编程语言提供了允许更为复杂的执行路径的多种控制结构。 循环语句允许我们多次…

代码随想录-刷题第三十天

332. 重新安排行程 题目链接&#xff1a;332. 重新安排行程 直觉上来看这道题和回溯法没有什么关系&#xff0c;更像是图论中的深度优先搜索。 这道题算是图论里深搜的题目&#xff0c;可以用回溯法的套路来解这道题目&#xff0c;算是拓展一下思路&#xff0c;原来回溯法还…

[Big Bird]论文解读:Big Bird: Transformers for Longer Sequences

文章目录 1 介绍2 模型架构3 结果 论文&#xff1a;Big Bird: Transformers for Longer Sequences 作者&#xff1a;Manzil Zaheer, Guru Guruganesh, Avinava Dubey, Joshua Ainslie, Chris Alberti, Santiago Ontanon, Philip Pham, Anirudh Ravula, Qifan Wang, Li Yang, Am…

[计网00] 计算机网络开篇导论

目录 前言 计算机网络的概念 计算机网络的分层 计算机网络的分类 网络的标准化工作和相关组织 计算机网络的性能指标 前言 计算机网络在我们的日常生活中无处不在 在网络会有各种各样的协议和封装 保证我们的信息完整,无误的在各个客户端之前传输 计算机网络的概念 四…

c语言 文件与文件操作

&#x1f3e0; 一.引言 我们日常生活中会将我们制作的ppt,word等存放在文件里进行归类&#xff0c;你是否知道我们能用cC语言对文件进行操作呢(比如文件的打开&#xff0c;关闭和读写等)&#xff1f;那接下来跟博主一起来学习下吧。 &#x1f3e0;二.什么是文件 磁盘上的文件就…

TCP/IP详解——FTP 协议,Telnet协议

文章目录 1. FTP 协议1.1 FTP的应用1.2 FTP传输文件的过程1.3 FTP传输模式1.4 主动模式&#xff08;Active Mode&#xff09;1.5 Active Mode 抓包分析1.6 被动模式&#xff08;Passive Mode&#xff09;1.7 Passive Mode 抓包分析 2. Telnet 协议2.1 Telnet 概念2.2 Telnet 协…

Python电能质量扰动信号分类(一)基于LSTM模型的一维信号分类

目录 引言 1 数据集制作与加载 1.1 导入数据 1.2 制作数据集 2 LSTM分类模型和超参数选取 2.1 定义LSTM分类模型 2.2 定义模型参数 3 LSTM模型训练与评估 3.1 模型训练 3.2 模型评估 往期精彩内容&#xff1a; Python-凯斯西储大学&#xff08;CWRU&#xff09;轴承…

Word写大论文常见问题(持续更新)

脚注横线未定格 解决方案&#xff1a;“视图”-“草图”&#xff0c;“引用”-“显示备注”-选择“脚注分隔符”&#xff0c;把横线前的空格删掉。 2.PPT做的图插入word中清晰度太低 解决方案&#xff1a;PPT-图形-“另存为图片”-“可缩放矢量图格式”-粘贴到word中。

RDD编程

目录 一、RDD编程基础 &#xff08;一&#xff09;RDD创建 &#xff08;二&#xff09;RDD操作 1、转换操作 2、行动操作 3、惰性机制 &#xff08;三&#xff09;持久化 &#xff08;四&#xff09;分区 &#xff08;五&#xff09;一个综合实例 二、键值对RDD &am…

社交网络分析3:社交网络隐私攻击、保护的基本概念和方法 + 去匿名化技术 + 推理攻击技术 + k-匿名 + 基于聚类的隐私保护算法

社交网络分析3&#xff1a;社交网络隐私攻击、保护的基本概念和方法 去匿名化技术 推理攻击技术 k-匿名 基于聚类的隐私保护算法 写在最前面社交网络隐私泄露用户数据暴露的途径复杂行为的隐私风险技术发展带来的隐私挑战经济利益与数据售卖防范措施 社交网络 用户数据隐私…