【学习笔记】[AGC043F] Jewelry Box

点击看题意

Part 1

前置知识: L P LP LP对偶费用流。

考虑这样一个费用流:每条边 u v uv uv的流量设为 f u v f_{uv} fuv,容量设为 c u v c_{uv} cuv,费用设为 w u v w_{uv} wuv b u b_u bu设为流出-流入。要求 m i n i m i z e ∑ f u v w u v {\rm minimize} \sum f_{uv}w_{uv} minimizefuvwuv。通常来讲,如果 b u > 0 b_u>0 bu>0则从源点 S S S补流过来,否则流向汇点 T T T,因此这是一个最小费用最大流问题(假设原图没有负环)。

经过 一番操作 ,可以发现对偶过后长这样:

m i n i m i z e ∑ u b u p u + ∑ u v c u v max ⁡ ( 0 , p v − p u − w u v ) {\rm minimize}\sum_{u}b_up_u+\sum_{uv}c_{uv}\max(0,p_v-p_u-w_{uv}) minimizeubupu+uvcuvmax(0,pvpuwuv)

注意,两者对应的答案互为相反数,因此提取答案时要取负。

通常来讲,后面的式子一般出现在含差分约束的式子中。而为了减少一条约束中变量的数量,我们通常需要转化为前缀和。

PS:建议 b u b_u bu不要像这篇博客一样写成流入-流出,否则后面推出来怪怪的。。。

Part 2

首先根据贪心,一定是将一个商店里的 A A A个珠宝按重量从小到大排序,然后将每个商店中对应第 i i i大的珠宝放在一起,如果这样都不行的话就不合法。

进一步的,考虑设 x i , j x_{i,j} xi,j表示第 i i i个商店选的编号 ≤ j \le j j的珠宝的数量(注意一定要把 i = 0 i=0 i=0的变量也建出来),那么对于一条限制 ( u , v , w ) (u,v,w) (u,v,w) ∀ i ∈ [ 1 , K v ] \forall i\in [1,K_v] i[1,Kv],设 j j j是最小的满足 S u , j + w ≥ S v , i S_{u,j}+w\ge S_{v,i} Su,j+wSv,i的数,则 x u , j − 1 ≤ x v , i − 1 x_{u,j-1}\le x_{v,i-1} xu,j1xv,i1

现在写出问题对应的线性规划形式:

m i n i m i z e ∑ x i , j ( P i , j − P i , j + 1 ) s . t . x i , j − x i , j + 1 ≤ 0 x i , j + 1 − x i , j − C i , j + 1 ≤ 0 x u , k − x v , j ≤ 0 x i , K i − x i , 0 − A ≤ 0 x i , 0 − x i , K i + A ≤ 0 x i , 0 = x j , 0 x i , j ≥ 0 {\rm minimize} \sum x_{i,j}(P_{i,j}-P_{i,j+1})\\ s.t.\ \ \ x_{i,j}-x_{i,j+1}\le 0\\x_{i,j+1}-x_{i,j}-C_{i,j+1}\le 0\\ x_{u,k}-x_{v,j}\le 0\\ x_{i,K_i}-x_{i,0}-A\le 0\\ x_{i,0}-x_{i,K_i}+A\le 0\\ x_{i,0}=x_{j,0}\\ x_{i,j}\ge 0 minimizexi,j(Pi,jPi,j+1)s.t.   xi,jxi,j+10xi,j+1xi,jCi,j+10xu,kxv,j0xi,Kixi,0A0xi,0xi,Ki+A0xi,0=xj,0xi,j0

现在对于每条差分约束 x − y ≤ w x-y\le w xyw,都连一条 ( y , x , ∞ , w ) (y,x,\infty,w) (y,x,,w)的边,然后根据 P i , j − P i , j + 1 P_{i,j}-P_{i,j+1} Pi,jPi,j+1的正负建立源汇点平衡流量,答案就是对应的最小费用最大流。

但是这样无法处理多组询问。注意到原图上存在 x i , j x_{i,j} xi,j x i , j − 1 x_{i,j-1} xi,j1的容量为 ∞ \infty ,费用为 0 0 0的边,而 x i , j x_{i,j} xi,j的流出量为 P i , j − P i , j + 1 P_{i,j}-P_{i,j+1} Pi,jPi,j+1,因此考虑先在 x i , j x_{i,j} xi,j x i , j − 1 x_{i,j-1} xi,j1这条边流大小为 P i , j P_{i,j} Pi,j的流量,然后连一条 ( x i , j − 1 , x i , j , P i , j , 0 ) (x_{i,j-1},x_{i,j},P_{i,j},0) (xi,j1,xi,j,Pi,j,0)的边表示可以反悔,不难发现这样每条边都自动流量平衡了。这样我们将问题转化为了最小费用可行流,即不断找负环增广,直到代价 > 0 >0 >0

现在,注意到整张图实际上只有 x i , K i x_{i,K_i} xi,Ki x i , 0 x_{i,0} xi,0这一条负边,因此这条边一定会被增广,这实际上就是从 x 0 , j x_{0,j} x0,j x i , K i x_{i,K_i} xi,Ki的最小回归代价减去 A A A(注意 j j j是任意的,这是 x i , 0 = x j , 0 x_{i,0}=x_{j,0} xi,0=xj,0建出来的边),所以如果将所有 x 0 , j x_{0,j} x0,j看成源点 S S S x i , K i x_{i,K_i} xi,Ki看成汇点 T T T,答案就是从 S S S T T T不断增广,直到代价 > A >A >A时的答案。

注意到代价为 A A A的边其实是废边,所以这张图实际上和 A A A没关系了。又因为费用流具有凸性,因此二分即可。

怎么判无解?有解等价于差分约束有解,也就是说没有负环(这里指容量为 ∞ \infty 的边),而有负环的时候总流量一定为 ∞ \infty

大力冲费用流即可。大概要跑 ∑ P i , j \sum P_{i,j} Pi,j次最短路。

#include<bits/stdc++.h>
#define fi first
#define se second
#define inf 0x3f3f3f3f3f3f3f3f
#define int ll
#define ll long long
using namespace std;
const int N=114514;
const int M=114514;
int n,m,s,t,idx; 
int head[M],nxt[M],to[M],cap[M],cost[M],tot=1;
queue<int>Q;
int dis[N],pre[N],vis[N];
void add(int u,int v,int w,int c){tot++,to[tot]=v,nxt[tot]=head[u],head[u]=tot,cap[tot]=w,cost[tot]=c;tot++,to[tot]=u,nxt[tot]=head[v],head[v]=tot,cap[tot]=0,cost[tot]=-c;
}
bool spfa(){for(int i=1;i<=idx;i++)dis[i]=inf,vis[i]=0;dis[s]=0;Q.push(s);vis[s]=1;while(Q.size()) {int u=Q.front();Q.pop();vis[u]=0;for(int k=head[u];k;k=nxt[k]){int v=to[k];if(cap[k]>0&&dis[u]+cost[k]<dis[v]) {dis[v]=dis[u]+cost[k];pre[v]=k;if(!vis[v]) {vis[v]=1;Q.push(v);}}}}return dis[t]!=inf;
}
int cnt;
ll f[N],sm1[N],sm2[N];
void EK(){while(spfa()){int now=t,flo=inf;while(now!=s){int k=pre[now];flo=min(flo,cap[k]);now=to[k^1];}f[++cnt]=dis[t],sm1[cnt]=sm1[cnt-1]+flo,sm2[cnt]=sm2[cnt-1]+flo*dis[t];if(sm1[cnt]>inf)break;now=t;while(now!=s){int k=pre[now];cap[k]-=flo;cap[k^1]+=flo;now=to[k^1];}}
}
int sz[35],id[35][35];
struct node{int s,p,c;bool operator <(const node &r)const{return s<r.s;}
}a[35][35];
signed main(){//freopen("data.in","r",stdin);ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>n,s=++idx,t=++idx;for(int i=1;i<=n;i++){cin>>sz[i];for(int j=1;j<=sz[i];j++)cin>>a[i][j].s>>a[i][j].p>>a[i][j].c;sort(a[i]+1,a[i]+1+sz[i]);for(int j=1;j<sz[i];j++)id[i][j]=++idx;id[i][0]=s,id[i][sz[i]]=t;for(int j=0;j<sz[i];j++){add(id[i][j],id[i][j+1],inf,a[i][j+1].c);add(id[i][j],id[i][j+1],a[i][j+1].p,0);}}cin>>m;for(int i=1;i<=m;i++){int u,v,w;cin>>u>>v>>w;int k=1;for(int j=1;j<=sz[v];j++){while(k<=sz[u]&&a[v][j].s>a[u][k].s+w)k++;add(id[v][j-1],id[u][k-1],inf,0);}}EK();int _Q;cin>>_Q;while(_Q--){int x;cin>>x;if(x>f[cnt]){cout<<-1<<"\n";}else{int p=lower_bound(f+1,f+1+cnt,x)-f-1;cout<<x*sm1[p]-sm2[p]<<"\n";}}
}

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

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

相关文章

工具一本通--Jmeter

工具安装 安装程序包 运行Jmeter.bat 语言设置成中文 1 临时修改&#xff1a;Options > Choose Language > Chinese(Simplified) 2 永久修改&#xff1a;./bin/jmeter.properties #Preferred GUI language. Comment out to use the JVM default locale’s language. #la…

Docker部署Traefik结合内网穿透远程访问Dashboard界面

文章目录 前言1. Docker 部署 Trfɪk2. 本地访问traefik测试3. Linux 安装cpolar4. 配置Traefik公网访问地址5. 公网远程访问Traefik6. 固定Traefik公网地址 前言 Trfɪk 是一个云原生的新型的 HTTP 反向代理、负载均衡软件&#xff0c;能轻易的部署微服务。它支持多种后端 (D…

手机视频转换gif怎么操作?一个小妙招教你手机在线制gif

在现代社会gif动图已经是一种非常流行的图片格式了。可以通过视频转换gif的方式将自己的想法和创意制作成gif动图与好友进行分享斗图。那么&#xff0c;当我们想要在手机上完成视频转换成gif动图是应该怎么办呢&#xff1f;通过使用手机端的gif动图制作&#xff08;https://www…

uniapp 权限申请插件(权限使用说明) Ba-Permissions

简介&#xff08;下载地址&#xff09; Ba-Permissions 是一款权限申请插件&#xff0c;支持权限使用说明弹窗&#xff0c;满足市场审核需求。支持自定义权限申请&#xff0c;也支持快速申请定位、相机、媒体、文件、悬浮窗等常见权限。 支持权限使用说明弹窗&#xff0c;满足…

16 命令行模式

命令行模式 将行为的执行与与行为的调用通过命令分离&#xff0c;行为的的调用者不需要知道具体是哪个类执行的&#xff0c;他们之间通过命令连接。 demo的目录结构 命令的执行者&#xff08;接口&#xff09; package behavioralpattern.commandpattern.actuator;import ja…

ctrl+c与kill -2的区别

单进程场景 在单进程的情况下&#xff0c;ctrlc和kill -2是一模一样的&#xff0c;都是向指定的进程发送SIGINT信号. 如果进程中注册了捕捉SIGINT信号的处理函数&#xff0c;那么这个信号会被进程处理&#xff0c;例如&#xff1a; void processB() {// Set signal handler …

el-tabs那些事

去除el-tab-pane的内边距 :deep(.el-tabs--border-card > .el-tabs__content) {padding: 0; }

VMware workstation安装Fedora-Server-39-1.5虚拟机并配置网络

VMware workstation安装Fedora-Server-39-1.5虚拟机并配置网络 Fedora包含的软件以自由及开放源码许可来发布&#xff0c;并旨在成为该技术领域的领先者。Fedora在专注创新、抢先集成新技术、与上游Linux社区紧密工作方面拥有良好名声。该文档适用于在VMware workstation平台安…

对C语言的标准库、头文件的理解

1.什么是标准库呢&#xff1f; 有很多我们使用的功能并不是我们自己写的&#xff0c;而是C语言自带的。而这些C 语言自带的所有这些功能统称为“标准库”(standard library)&#xff0c;包含C 内置函数、常量和头文件。我们直接调用即可。 2.什么是头文件呢&#xff1f; 不同的…

java-方法:函数、过程

方法作用 - 封装一段特定的业务逻辑功能 - 尽可能的独立&#xff0c;一个方法只干一件事 - 方法可以被反复多次调用 - 减少代码重复&#xff0c;有利于代码复用&#xff0c;有利于代码维护 定义方法&#xff1a;五要素 ​ 修饰词 返回值类型 方法名(参数列表…

矩阵快速幂算法总结

题目链接 活动 - AcWing 本课程系统讲解常用算法与数据结构的应用方式与技巧。https://www.acwing.com/problem/content/1305/ 题解 代码 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm>using namespace std;type…

MySQL多表关联查询练习题

一、创建表的素材 1.创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) ); 创建score表。SQL代码如下&#xff1a; …

Android的setContentView流程

一.Activity里面的mWindow是啥 在ActivityThread的performLaunchActivity方法里面&#xff1a; private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {ActivityInfo aInfo r.activityInfo;if (r.packageInfo null) {r.packageInfo getP…

15 万奖金!开放原子开源大赛 OpenAnolis -云原生赛题报名开始

开放原子开源基金会牵头发起的首届“开放原子开源大赛”&#xff0c;旨在联合开源组织、企事业单位、高等院校、科研院所、行业组织、投融资机构等多方资源&#xff0c;充分发挥产业链生态上下游的协同能力&#xff0c;基于开源共享、共建共治的原则共同举办。大赛搭建面向全球…

教育新势力:多端口知识付费小程序重塑在线教育生态

随着知识付费市场的蓬勃发展&#xff0c;多端口知识付费小程序已成为课程销售的关键工具。本文将探讨多端口知识付费小程序的重要性和乔拓云教育系统的功能&#xff0c;帮助您在网上成功销售课程。 一、多端口知识付费小程序的优点 多端口知识付费小程序具有多渠道触达用户、提…

IOS 相机权限申请-swift

配置描述 在Info.plist文件中&#xff0c;新建一个键值对Privacy - Camera Usage Description&#xff08;或者NSCameraUsageDescription&#xff09;&#xff0c;值为申请描述说明&#xff0c;自定义的 申请 然后在需要申请的文件中导入AVFoundation import AVFoundation…

你觉得哪个软件写verilog体验最好?

**“你觉得哪个软件写verilog体验最好&#xff1f;”**这个问题是我再网络上看到的一个热点话题&#xff0c;浏览量高达733911&#xff0c;引起大家的广泛讨论。移知教育小编特意请教了行业大咖&#xff0c;下面为大家分享解答&#xff0c;希望能为大家带来帮助。 有几个流行的…

跟着cherno手搓游戏引擎【4】窗口抽象、GLFW配置、窗口事件

引入GLFW&#xff1a; 在vendor里创建GLFW文件夹&#xff1a; 在github上下载&#xff0c;把包下载到GLFW包下。 GitHub - TheCherno/glfw: A multi-platform library for OpenGL, OpenGL ES, Vulkan, window and input修改SRC/premake5.lua的配置&#xff1a;12、13、15、36…

Hudi metadata table(元数据表)

什么是metadata表 Metadata表即Hudi元数据表,是一种特殊的Hudi表,对用户隐藏。该表用于存放普通Hudi表的元数据信息。Metadata表包含在普通Hudi表内部,与Hudi表是一一对应关系。 元数据表的作用 ApacheHudi元数据表可以显著提高查询的读/写性能。元数据表的主要目的是消…

分布式架构理论:从头梳理分布式架构的重难点

文章目录 一、分布式架构 - 系统理论1、分布式一致性与CAP理论2、BASE理论3、分布式一致性算法&#xff1a;Raft&#xff08;1&#xff09;Paxos算法&#xff08;2&#xff09;Raft算法&#xff08;3&#xff09;共识算法&#xff1a;拜占庭将军问题 4、脑裂现象和Lease机制&am…