CF1656F Parametric MST 题解

为了便于解题,先对 a 数组从小到大进行排序。

首先,根据定义可以得出总价值的表达式:

W=(u,v)E[auav+t(au+av)]=(u,v)Eauav+t(u,v)E(au+av)

接着,我们需要发现一个比较重要的性质:

  • wi,j(t)=aiaj+t(ai+aj)=(ai+t)(aj+t)t2

也就是说,如果固定一个 t,那么 t2 就是定值,可以暂不考虑;1in,如果 ai+t 是正数,就向结点 1 连边以最小化该点的贡献;如果 ai+t 是负数,就向结点 n 连边(如果 ai+t=0 那么向哪个点连边都一样)。最后去掉 1n 之间的重边以及若干自环,即可构造出正好有 n1 条边的最小生成树。

现在来考虑一下无解的情况:

  • 如果 1in,ai+t>0,那么除了 1 以外的所有结点向 1 连边,有

    W=(u,v)Eauav+t(u,v)E(au+av)=a1i=2nai+t[(n1)a1+i=2nai]

    可以发现,W 是关于 t 的一次函数。由于满足 1in,ai+t>0,所以如果一次项系数 (n1)a1+i=2nai>0,那么当 t+W+,该函数不存在最大值。

  • 如果 1in,ai+t<0,同理有:

    W=ani=1n1ai+t[(n1)an+i=1n1ai]

    类似的,如果 (n1)an+i=1n1ai<0,当 t 时,W+,不存在最大值。

综上,如果 (n1)a1+i=2nai>0(n1)an+i=1n1ai<0,边权和不存在最大值,直接输出 INF 即可。

现在来考虑有解时如何寻找解。这时我们就需要引入一个新的性质:

  • 如果 W 能取到最大值,t 的值一定是 a 数组中的其中一个元素的值。

    证明:

    容易得知当 W 取到最值时,a1tan(否则函数不收敛)。

    t[ai,ai+1](1i<n) 时,最优的连边方式之一是将所有的 1ji 向结点 n 连边(因为这些 j 满足 aj+t0),其他结点向 1 连边。所以我们可以得到 W 的表达式:

    W=anj=2iaj+t[(i1)an+j=2iaj]+a1j=i+1naj+t[(ni)a1+j=i+1naj]

    (注意到这里 1n 之间的边仅仅被连了一次,所以最终不用考虑重边的影响。)

    在这里因为 i 确定,所以 W 还是关于 t 的一次函数,最值必然在 t=ait=ai+1 时取到。命题得证。

接下来只用枚举 i=1,2,,n,然后令 t=ai,将 t 带入证明中的那个表达式算出 W 的值。在所有的 W 中找到 Wmax 并输出即可。

中间那一些求和的式子可以使用前缀和维护。

放代码:

#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;
}
posted @   FFTotoro  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示