首页 > 其他分享 >CF1656F Parametric MST

CF1656F Parametric MST

时间:2022-11-08 22:11:06浏览次数:37  
标签:ch int 最大值 MST CF1656F 最小 一次函数 times Parametric

给定一张 \(n\) 个点的无向完全图 \(K_n(t)\),点 \(i\) 和点 \(j\) 之间的边的边权 \(w_{i,j}(t)\) 为 \(a_i\times a_j+t \times (a_i+a_j)\),其中 \(t\) 为任意实数。

定义 \(f(t)\) 为 \(K_n(t)\) 的最小生成树的边权和。输出 \(f(t)\) 的最大值,无最大值则输出 INF

分析

首先将 \(a\) 从小到大排序,设 \(s\) 为 \(a\) 的前缀和
,确定 \(i\) 时,\(a_ia_j+t(a_i+a_j)=(t+a_i)a_j+ta_i\) 。

因为 \(ta_i\) 是个定值,所以只需考虑 \(t+a_i\) 的正负,若 \(t+a_i\) 为正则肯定贪心选择最小的 \(a_j\),否则选择最大的 \(a_j\) 。所以,对于 \(t\) 非常大,若 \((a_1*(n-1)+s_n-s_1)>0\) 则为 \(INF\),同理若 \(t\) 是非常小的负数,若 \((a_n*(n-1)+s_n-s_1)<0\) 则为 \(INF\)。

其它情况我们观察一下式子 \(w_{i,j}(t)=a_ia_j+t(a_i+a_j)=(a_i+t)(a_j+t)-t^2\),令\(b_i=a_i+t\),则权值为 \(w_{i,j}(t)=b_ib_j-t^2\),令 \(w_{i,j}=b_ib_j\) 则 \(f(t)=mst-(n-1)t^2\) ( \(mst\) 为最小生成树权值和),对于所有的对于任意一个 \(t\),一定满足 $ [1,i]\ b_i<0$ ,\([i+1,n]\ b_i>0\),对于 $ b_i<0$ 我们将其和 \(max(b_i)\)) 相连,对于 $ b_i>0$ 我们将其和 \(min(b_i)\) 相连,这样求出来的就是最小值,通过枚举 \(t\) 求解即可。

发现 t 在 \([-a_{i+1},-a_i]\) 可以把这个范围内的 \(f(t)\) 表示成一个关于 \(t\) 的一次函数。这怎么理解呢?比如说,t 在 \([-a_{i+1},-a_i]\) 范围内,每次 \(+1\),最小生成树选择的边是不会变的,则答案就会变化 \(\sum{a_i+a_j}-2\times t\times (n-1)\),( \((i,j)\) 为选择的边),显然 \(\sum{a_i+a_j}\) 的值不会变,所以为一次函数。所以,最大值肯定取在端点处,所以依次只要枚举 \(t=-a_i\) 的权值,再取个最大值就行了。

\(code\)

#include<bits/stdc++.h>
#define N 200005
#define int long long
using namespace std;
int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return x*f;
}
int T,n;
int a[N],s[N];
signed main(){
	T=read();
	while(T--){
		n=read();
		for(int i=1;i<=n;++i) a[i]=read();
		sort(a+1,a+1+n);
		for(int i=1;i<=n;++i) s[i]=s[i-1]+a[i];
		if(s[n]-s[1]+a[1]*(n-1)>0||s[n-1]+a[n]*(n-1)<0){printf("INF\n");continue;}
		int ans=-1e18;
		for(int i=1;i<=n;++i){
			int t=-a[i];
			int maxn=a[n]+t,minn=a[1]+t;
			int ls=s[i]+i*t,rs=s[n]-s[i]+(n-i)*t;
			ans=max(ans,ls*maxn+rs*minn-minn*maxn-(n-1)*t*t);
		}
		printf("%lld\n",ans);
	}
	return 0;
} 

标签:ch,int,最大值,MST,CF1656F,最小,一次函数,times,Parametric
From: https://www.cnblogs.com/jiangchenyyds/p/16871411.html

相关文章

  • Camstar获取回参
     publicstaticboolSplitQty(stringUsername,stringPassword,stringContainer,intsplitQty,intplateQty,refList<string>childList,refstringMsg)......
  • 关闭显示远程桌面mstsc顶部(侧面)连接栏
    在进行mstsc远程桌面连接电脑或者虚拟机的时候,总是会出现一个连接栏。虽然点左边的图钉可以自动隐藏,但是每次鼠标滑到上面的时候,还是会冒出来,这个就有点闹心了。查了下相......
  • 在使用mstsc远程连接Windows 2016 Server服务器时报错“出现身份验证错误 要求的函数
    问题描述:在使用mstsc远程连接Windows2016Server服务器时报错“出现身份验证错误要求的函数不受支持……”,如下所示:解决方案:在windows2016server服务器远程设置上不勾......
  • activemq-cpp getCMSType类型判断是否有效
    场景   CMS消息类型有BytesMessage,TextMessage,MapMessage,StreamMessage,是否可以通过getCMSType知道是哪一个类型的消息?答案    不行,依然需要通过constcms::By......
  • C#中Trim()、TrimStart()、TrimEnd()的用法
    https://www.cnblogs.com/carekee/articles/2094731.htmlC#中Trim()、TrimStart()、TrimEnd()的用法:   这三个方法用于删除字符串头尾出现的某些字符。Trim()删除字......
  • 【XSY2485】MST(最小生成树+倍增lca+并查集)
    题面Description给定一个\(n\)个点\(m\)条边的连通图,保证没有自环和重边。对于每条边求出,在其他边权值不变的情况下,它能取的最大权值,使得这条边在连通图的所有最小生成......
  • 【CF888G】Xor-MST(01Trie,最小生成树)
    看到异或最值要么是线性基要么是01Trie。线性基显然可以排除。那么先把所有的\(a_i\)插入01Trie内。然后发现对于任意两个数\(a_i\)和\(a_j\):你发现它们在\(......
  • Linux vmstat命令实战详解
    vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix......
  • MST算法-堆优化Prim与并查集优化Kruskal
    生成树首先,生成树是相对于连通图来说的。它是一个连通图的子图,而且没有环,也可以看成是一棵树。对于生成树,其所有结点的根节点都是同一个。生成树有以下两个性质:生成树......
  • dremio HomeFileSystemStoragePlugin简单介绍
    使用过dremio的同学应该了解dremio对于每个用户会支持一个@的导航(小房子标记)参考接口效果restapi请求的,会包含一个containerTypehome的就是HomeFileSystemStorage......