CF1656F Parametric MST 题解
为了便于解题,先对 \(a\) 数组从小到大进行排序。
首先,根据定义可以得出总价值的表达式:
W&=\sum\limits_{(u,v)\in E}[a_ua_v+t(a_u+a_v)]\\
&=\sum\limits_{(u,v)\in E}a_ua_v+t\sum\limits_{(u,v)\in E}(a_u+a_v)
\end{aligned}
\]
接着,我们需要发现一个比较重要的性质:
- \(w_{i,j}(t)=a_ia_j+t(a_i+a_j)=(a_i+t)(a_j+t)-t^2\)
也就是说,如果固定一个 \(t\),那么 \(t^2\) 就是定值,可以暂不考虑;\(\forall 1\le i\le n\),如果 \(a_i+t\) 是正数,就向结点 \(1\) 连边以最小化该点的贡献;如果 \(a_i+t\) 是负数,就向结点 \(n\) 连边(如果 \(a_i+t=0\) 那么向哪个点连边都一样)。最后去掉 \(1\) 与 \(n\) 之间的重边以及若干自环,即可构造出正好有 \(n-1\) 条边的最小生成树。
现在来考虑一下无解的情况:
如果 \(\forall 1\le i\le n,a_i+t>0\),那么除了 \(1\) 以外的所有结点向 \(1\) 连边,有
\[\begin{aligned}
W&=\sum\limits_{(u,v)\in E}a_ua_v+t\sum\limits_{(u,v)\in E}(a_u+a_v)\\
&=a_1\sum\limits_{i=2}^na_i+t\left[(n-1)a_1+\sum\limits_{i=2}^na_i\right]\\
\end{aligned}
\]可以发现,\(W\) 是关于 \(t\) 的一次函数。由于满足 \(\forall 1\le i\le n,a_i+t>0\),所以如果一次项系数 \((n-1)a_1+\sum\limits_{i=2}^na_i>0\),那么当 \(t\rightarrow+\infty\) 时 \(W\rightarrow+\infty\),该函数不存在最大值。
如果 \(\forall 1\le i\le n,a_i+t<0\),同理有:
\[\begin{aligned}
W&=a_n\sum\limits_{i=1}^{n-1}a_i+t\left[(n-1)a_n+\sum\limits_{i=1}^{n-1}a_i\right]\\
\end{aligned}
\]类似的,如果 \((n-1)a_n+\sum\limits_{i=1}^{n-1}a_i<0\),当 \(t\rightarrow-\infty\) 时,\(W\rightarrow+\infty\),不存在最大值。
综上,如果 \((n-1)a_1+\sum\limits_{i=2}^na_i>0\) 或 \((n-1)a_n+\sum\limits_{i=1}^{n-1}a_i<0\),边权和不存在最大值,直接输出 INF 即可。
现在来考虑有解时如何寻找解。这时我们就需要引入一个新的性质:
如果 \(W\) 能取到最大值,\(-t\) 的值一定是 \(a\) 数组中的其中一个元素的值。
证明:
容易得知当 \(W\) 取到最值时,\(a_1\le -t\le a_n\)(否则函数不收敛)。
当 \(-t\in[a_i,a_{i+1}](1\le i<n)\) 时,最优的连边方式之一是将所有的 \(1\le j\le i\) 向结点 \(n\) 连边(因为这些 \(j\) 满足 \(a_j+t\le 0\)),其他结点向 \(1\) 连边。所以我们可以得到 \(W\) 的表达式:
\[\begin{aligned}
W&=a_n\sum\limits_{j=2}^ia_j+t\left[(i-1)a_n+\sum\limits_{j=2}^ia_j\right]+a_1\sum\limits_{j=i+1}^na_j+t\left[(n-i)a_1+\sum_{j=i+1}^na_j\right]
\end{aligned}
\](注意到这里 \(1\) 和 \(n\) 之间的边仅仅被连了一次,所以最终不用考虑重边的影响。)
在这里因为 \(i\) 确定,所以 \(W\) 还是关于 \(t\) 的一次函数,最值必然在 \(-t=a_i\) 或 \(-t=a_{i+1}\) 时取到。命题得证。
接下来只用枚举 \(i=1,2,\ldots,n\),然后令 \(t=-a_i\),将 \(t\) 带入证明中的那个表达式算出 \(W\) 的值。在所有的 \(W\) 中找到 \(W_{\max}\) 并输出即可。
中间那一些求和的式子可以使用前缀和维护。
放代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
main(){
ios::sync_with_stdio(false);
int t; cin>>t;
while(t--){
int n,c=LLONG_MIN; cin>>n;
vector<int> a(n),s;
for(auto &i:a)cin>>i;
sort(a.begin(),a.end()); // 排序
partial_sum(a.begin(),a.end(),back_inserter(s)); // 做前缀和
if(a[0]*(n-2)+s[n-1]>0||a[n-1]*(n-2)+s[n-1]<0)cout<<"INF\n"; // 无解情况
else{
for(int i=0;i<n;i++)
c=max(c,a[0]*(s[n-1]-s[i])-a[i]*(a[0]*(n-i-1)+s[n-1]-s[i])+a[n-1]*(s[i]-s[0])-a[i]*(a[n-1]*i+s[i]-s[0]));
// 带入表达式计算
cout<<c<<endl;
}
}
return 0;
}
CF1656F Parametric MST 题解的更多相关文章
- [转] POJ图论入门
最短路问题此类问题类型不多,变形较少 POJ 2449 Remmarguts' Date(中等)http://acm.pku.edu.cn/JudgeOnline/problem?id=2449题意: ...
- [HNOI2010]CITY 城市建设
问题: 给一张图,支持边长度修改,求MST 题解: 自己想就想不到了.. 考虑cdq分治 1.首先求出一定有用的边 对于未处理的边,全部设为-INF,求一次MST,出现在MST上的边一定最终出现在后面 ...
- 【AtCoder】CODE FESTIVAL 2017 Final
A - AKIBA 模拟即可 代码 #include <bits/stdc++.h> #define fi first #define se second #define pii pair ...
- kuangbin 最小生成树
A & M - Jungle Roads HDU - 1301 题意:字母之间的路,求最小生成树 题解:处理好建边以后就是一个Prime #include<cstdio> #inc ...
- 题解-AtCoder Code-Festival2017 Final-J Tree MST
Problem \(\mathrm{Code~Festival~2017~Final~J}\) 题意概要:一棵 \(n\) 个节点有点权边权的树.构建一张完全图,对于任意一对点 \((x,y)\),连 ...
- 【题解】 AT2134 Zigzag MST
[题解]AT2134 Zigzag MST 一道MST好题 \(Anson\)有云: 要么是减少边的数量. 要么是改变连接边的方式. 那么如何减少边的数量呢?很简单,把所有不可能对答案产生贡献的边去掉 ...
- Codeforces 196E Opening Portals MST (看题解)
Opening Portals 我们先考虑如果所有点都是特殊点, 那么就是对整个图求个MST. 想在如果不是所有点是特殊点的话, 我们能不能也 转换成求MST的问题呢? 相当于我们把特殊点扣出来, 然 ...
- POJ 1679 The Unique MST (次小生成树)题解
题意:构成MST是否唯一 思路: 问最小生成树是否唯一.我们可以先用Prim找到一棵最小生成树,然后保存好MST中任意两个点i到j的这条路径中的最大边的权值Max[i][j],如果我们能找到一条边满足 ...
- POJ1258 Agri-Net MST最小生成树题解
搭建一个最小代价的网络,最原始的最小生成树的应用. 这里使用Union find和Kruskal算法求解. 注意: 1 给出的数据是原始的矩阵图,可是须要转化为边表示的图,方便运用Kruskal,由于 ...
- [题解] [AtCoder2134] Zigzag MST
题面 题解 考虑kruscal的过程 对于三个点\(x, y, x + 1\), 我们可以将\((x, y, z), (y, x + 1, z + 1)\)看做\((x, y, z), (x, x + ...
随机推荐
- 单元测试平台搭建:sonarQube+sonarScanner+Jenkins+jacoco
单元测试平台搭建及结果分析 一.方案 需求目标:提高单元测试覆盖率和规范代码编写规范 选用工具:Sonarqube.sonarqube Scanner.Jenkins.jacoco 方案: 工程中引入 ...
- 一文掌握 Kubernetes 证书
如果你正在自己的环境中运行 Kubernetes,那么了解证书的工作原理以及如何管理它们以确保集群的安全性和完整性至关重要.在本文中,我们将解释什么是 Kubernetes 证书.其重要性,以及如何检 ...
- 组合式api-侦听器watch的语法
和vue2对比,也是语法上稍有不同. 监听单个数据对象 <script setup> import {ref, watch} from "vue"; const cou ...
- 华企盾DSC服务器配置无法创建数据库
测试连接的数据库用户没有创建数据库的权限,应该打开数据库控制台,把对应用户的权限都勾上
- 万界星空科技服装行业mes解决方案
服装行业MES特色 企业透过全球供应链网络掌握实时的订单进度信息来实现电子商务排除生产现场自动化"孤岛",建立起业务计划层到控制层的桥梁,JIT库存管理与看板管理.精益生产与敏 ...
- 神经网络优化篇:详解梯度消失/梯度爆炸(Vanishing / Exploding gradients)
梯度消失/梯度爆炸 训练神经网络,尤其是深度神经所面临的一个问题就是梯度消失或梯度爆炸,也就是训练神经网络的时候,导数或坡度有时会变得非常大,或者非常小,甚至于以指数方式变小,这加大了训练的难度. 接 ...
- python中,如何优雅的解析和管理命令行参数
背景 我们在编写python程序时,程序中经常会提供多种功能或者模式,在实际使用时根据不同的参数使用不同的功能.那么如何获取命令行传入进来的参数呢? 一般方法 一般情况下,我们会使用 sys 模块,如 ...
- 斯坦福 UE4 C++ ActionRoguelike游戏实例教程 11.认识GAS & 创建自己的能力系统
斯坦福课程 UE4 C++ ActionRoguelike游戏实例教程 0.绪论 概述 本篇文章对应Lecture 16 - Writing our own Gameplay Ability Syst ...
- AntDesignBlazor示例——暗黑模式
本示例是AntDesign Blazor的入门示例,在学习的同时分享出来,以供新手参考. 示例代码仓库:https://gitee.com/known/BlazorDemo 1. 学习目标 暗黑模式切 ...
- vue强制横屏
在app.vue中 <template> <div id="app"> <router-view /> </div> </te ...