P5540-[BalkanOI2011]timeismoney|最小乘积生成树【最小生成树,凸壳】

正题

题目链接:https://www.luogu.com.cn/problem/P5540


题目大意

给出nnn个点mmm条边边权是一个二元组(ai,bi)(a_i,b_i)(ai,bi),求出一棵生成树最小化
(∑e∈Tae)×(∑e∈Tbe)(\sum_{e\in T}a_e)\times(\sum_{e\in T}b_e)(eTae)×(eTbe)
的情况下最小化∑e∈Tae\sum_{e\in T}a_eeTae

1≤n≤200,1≤m≤1041\leq n\leq 200,1\leq m\leq 10^41n200,1m104


解题思路

这种带乘积的可以维护凸壳,对于一棵生成树TTT我们视为一个(∑e∈Tae,∑e∈Tbi)(\sum_{e\in T}a_e,\sum_{e\in T}b_i)(eTae,eTbi)的点,这样我们打答案一定在下凸壳上。

可以用一种分治求凸壳的方法,我们先找出下凸壳的两个端点(xxx最小的和yyy最小的)记为A,BA,BA,B,然后找到一个在AAABBB的连边下面的一个最凸的点CCC(可以视为最大化S△ACBS_{\bigtriangleup ACB}SACB,这样CCC一定在凸壳上),然后分治下去做AC⃗\vec{AC}ACCB⃗\vec{CB}CB

考虑怎么求这个CCC,就是最大化AC⃗×CB⃗\vec{AC}\times \vec{CB}AC×CB
(xC−xA)(yB−yA)−(xB−xA)(yC−yA)(x_C-x_A)(y_B-y_A)-(x_B-x_A)(y_C-y_A)(xCxA)(yByA)(xBxA)(yCyA)
=xC(yB−yA)−yC(xB−xA)+yA(xB−xA)−xA(yB−yA)=x_C(y_B-y_A)-y_C(x_B-x_A)+y_A(x_B-x_A)-x_A(y_B-y_A)=xC(yByA)yC(xBxA)+yA(xBxA)xA(yByA)
然后就是相当于最小化xC(yB−yA)+yC(xA−xB)x_C(y_B-y_A)+y_C(x_A-x_B)xC(yByA)+yC(xAxB),拿这个当边权跑就可以跑出CCC了。

然后时间复杂度据说是O(mlog⁡mln⁡n!)O(m\log m\sqrt{\ln n!})O(mlogmlnn!)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=210,M=1e4+10;
struct node{ll x,y,w,id;
}e[M];
struct point{ll x,y;point(ll xx=0,ll yy=0){x=xx;y=yy;return;}
}ans;
ll n,m,x[M],y[M],a[M],b[M],fa[N];
point operator-(point x,point y)
{return point(x.x-y.x,x.y-y.y);}
ll operator*(point x,point y)
{return x.x*y.y-x.y*y.x;}
bool cmp(node x,node y)
{return (x.w==y.w)?(a[x.id]<a[y.id]):(x.w<y.w);}
ll find(ll x)
{return (fa[x]==x)?x:(fa[x]=find(fa[x]));}
point Kruskal(){ll cnt=0;point res=0;for(ll i=1;i<=n;i++)fa[i]=i;sort(e+1,e+1+m,cmp);for(ll i=1;i<=m;i++){ll x=find(e[i].x),y=find(e[i].y);if(x==y)continue;fa[x]=y;cnt++;res.x+=a[e[i].id];res.y+=b[e[i].id];if(cnt==n-1)break;}if(res.x*res.y<ans.x*ans.y)ans=res;else if(res.x*res.y==ans.x*ans.y&&res.x<ans.x)ans=res;return res;
}
void solve(point A,point B){for(ll i=1;i<=m;i++)e[i]=(node){x[i],y[i],(B.x-A.x)*b[i]+(A.y-B.y)*a[i],i};point C=Kruskal();if((C-A)*(B-A)<=0)return;solve(A,C);solve(C,B);
}
signed main()
{scanf("%lld%lld",&n,&m);for(ll i=1;i<=m;i++){scanf("%lld%lld%lld%lld",&x[i],&y[i],&a[i],&b[i]);x[i]++;y[i]++;}ans.x=ans.y=1e9;for(ll i=1;i<=m;i++)e[i]=(node){x[i],y[i],a[i],i};point A=Kruskal();for(ll i=1;i<=m;i++)e[i]=(node){x[i],y[i],b[i],i};point B=Kruskal();solve(A,B);printf("%lld %lld\n",ans.x,ans.y);return 0;
}

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

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

相关文章

【数论】能量采集(P1447)

正题 P1447 题目大意 给出n,m&#xff0c;求2∑i1n∑j1m(gcd(i,j)−1)nm2\times \sum_{i1}^n\sum_{j1}^m(gcd(i,j)-1)n\times m2i1∑n​j1∑m​(gcd(i,j)−1)nm 解题思路 2∑i1n∑j1m(gcd(i,j)−1)nm2∑i1n∑j1mgcd(i,j)−nm2\times \sum_{i1}^n\sum_{j1}^m(gcd(i,j)-1)n\tim…

codeforces1440 E. Greedy Shopping

昨天晚上做完4题还有30分钟&#xff0c;感觉太晚了就没继续写&#xff0c;不过看了下E题感觉是一个线段树题目&#xff0c;今天中午看了看发现就是一个线段树上递归的询问问题&#xff0c;不过我之前没写过但是靠着日益强大的乱写能力竟然水出来了~~ E. Greedy Shopping 不难…

MonkeyFest2018 微软最有价值专家讲座

MonkeyFest2018微软最有价值专家讲座Monkey Fest 是一个一年一度由全球Microsoft Xamarin跨平台开发者发起的全球性社区活动&#xff0c;主要是推广在云、人工智能、大数据、移动开发等技术。本次活动同时在新加坡&#xff0c;美国&#xff0c;日本&#xff0c;加拿大&#xff…

2020牛客国庆集训派对day2 MATRIX MULTIPLICATION CALCULATOR

MATRIX MULTIPLICATION CALCULATOR 题意&#xff1a; 求两矩阵相乘 题解&#xff1a; 应该都学过把。。。矩阵相乘 矩阵相乘的前提是两个矩阵的列等于另一个矩阵的行 也就是cij∑aik*bkj 原理很简单注意格式&#xff0c;但是我遇到一个玄学问题。。。 就是卡格式了。。我人…

P5369-[PKUSC2018]最大前缀和【状压dp】

正题 题目链接:https://www.luogu.com.cn/problem/P5369 题目大意 一个数列aaa的权值定义为max{∑i1kai}(k∈[1,n])max\{\sum_{i1}^ka_i\}(k\in[1,n])max{∑i1k​ai​}(k∈[1,n]) 给出nnn个数字&#xff0c;求它们所有排列的权值和 1≤n≤201\leq n\leq 201≤n≤20 解题思路 …

【数论】疯狂 LCM(P1891)

正题 P1891 题目大意 有T个询问&#xff0c;每个询问给出n&#xff0c;求∑i1nlcm(i,n)\sum_{i1}^nlcm(i,n)i1∑n​lcm(i,n) 解题思路 ∑i1nlcm(i,n)\sum_{i1}^nlcm(i,n)i1∑n​lcm(i,n) n∑i1ni/gcd(i,n)n\sum_{i1}^ni/gcd(i,n)ni1∑n​i/gcd(i,n) n∑d∣n1d∑i1ni[gcd(i,n)…

codeforces1440 D. Graph Subset Problem

D. Graph Subset Problem jiangly代码%%% 感谢大佬对jly代码的解释 先贪心找一下clique&#xff0c;如果某个点的度数是k-1&#xff0c;那就爆搜他的相邻节点组成clique&#xff0c;看看是不是完全子图。如果不是由于这个点的度数小于k&#xff08;若完全子图中由此点只能是c…

P3911 最小公倍数之和

最小公倍数之和 题目描述&#xff1a; 对于A1&#xff0c;A2…AN&#xff0c;求 ∑i1N∑i1Nlcm(Ai,Aj)\sum_{i1}^{N}\sum_{i1}^{N} lcm(Ai,Aj)∑i1N​∑i1N​lcm(Ai,Aj) 题解&#xff1a; 莫比乌斯反演&#xff0c;直接强推一波 推导过程我也是一知半解&#xff0c;大体如图…

终于明白了 C# 中 Task.Yield 的用途

最近在阅读 .NET Threadpool starvation, and how queuing makes it worse 这篇博文时发现文中代码中的一种 Task 用法之前从未见过&#xff0c;在网上看了一些资料后也是云里雾里不知其解&#xff0c;很是困扰。今天在程序员节的大好日子里终于想通了&#xff0c;于是写下这篇…

Wannafly挑战赛23F-计数【原根,矩阵树定理,拉格朗日插值】

正题 题目链接:https://ac.nowcoder.com/acm/contest/161/F 题目大意 给出nnn个点的一张图&#xff0c;求它的所有生成树中权值和为kkk的倍数的个数。输出答案对ppp取模 1≤n,k≤100,1≤m≤104,p∈[2,109]∩Pri1\leq n,k\leq 100,1\leq m\leq 10^4,p\in[2,10^9]\cap Pri1≤n,…

【数论】Crash的数字表格 / JZPTAB(P1829)

正题 P1829 题目大意 给出n,m&#xff0c;求∑i1n∑j1mlcm(i,j)\sum_{i1}^n\sum_{j1}^mlcm(i,j)i1∑n​j1∑m​lcm(i,j) 解题思路 ∑i1n∑j1mlcm(i,j)\sum_{i1}^n\sum_{j1}^mlcm(i,j)i1∑n​j1∑m​lcm(i,j) ∑d1nd∑i1n/d∑j1m/di∗j[gcd(i,j)1]\sum_{d1}^nd\sum_{i1}^{n/d}…

2018-2019 ACM-ICPC, Asia Seoul Regional Contest——A - Circuits

A - Circuits 不难发现x坐标根本没用&#xff0c;只需要存储y坐标。 题目所求的两条直线y1ay_1ay1​a&#xff0c;y2b(a<b)y_2b\ (a<b)y2​b (a<b) 我们枚举y2by_2by2​b这条线&#xff0c;这条线一定可以是矩形的边界&#xff0c;于是我们扫描矩形边界差分计算当前…

aspnet core 2.1中使用jwt从原理到精通一

原理jwt对所有语言都是通用的&#xff0c;只要知道秘钥&#xff0c;另一一种语言有可以对jwt的有效性进行判断;jwt的组成&#xff1b;Header部分Base64转化.Payload部分Base64转化.使用HS256方式根据秘钥对前面两部分进行加密后再Base64转化&#xff0c;其中使用的hs256加密是h…

2020牛客国庆集训派对day3 Points

Points 题目描述 Jack and Rose are playing games after working out so many difficult problems. They together drew a “Haizi” tree to show their collaboration. “Haizi” tree is the same as the tree defined in graph theory. Now Jack would like to count t…

CF1137F-Matches Are Not a Child‘s Play【LCT】

正题 题目链接:https://www.luogu.com.cn/problem/CF1137F 题目大意 给出nnn个点的一棵树&#xff0c;第iii个点权值为iii。 一棵树的删除序列定义为每次删除编号最小的叶子并将其加入序列末尾。 要求支持 修改一个点的权值为一个比目前所有权值都要大的一个值询问一个点在…

【数论】数表(P3312)

正题 P3312 题目大意 给出n,m,a&#xff0c;求∑i1n∑j1mσ(gcd(i,j))[σ(gcd(i,j))≤a]\sum_{i1}^n\sum_{j1}^m\sigma(gcd(i,j))[\sigma(gcd(i,j))\leq a]i1∑n​j1∑m​σ(gcd(i,j))[σ(gcd(i,j))≤a] 解题思路 先不考虑a的条件限制 ∑i1n∑j1mσ(gcd(i,j))\sum_{i1}^n\su…

codeforces1452 E. Two Editorials

E. Two Editorials 官方题解 首先将每个参赛者按照区间中点排序&#xff0c;那么前一段参赛者听第一个人&#xff0c;而后一段听第二个人的。 预处理数组su[j]表示j→mj\to mj→m这些参赛者能被“覆盖”最多“贡献” 只需要枚举第一个人演讲的区间&#xff0c;再考虑前多少参赛…

.NET Core微服务之路:利用DotNetty实现一个简单的通信过程

上一篇我们已经全面的介绍过《基于gRPC服务发现与服务治理的方案》&#xff0c;我们先复习一下RPC的调用过程&#xff08;笔者会在这一节的几篇文章中反复的强调这个过程调用方案&#xff09;&#xff0c;看下图根据上面图&#xff0c;服务化原理可以分为3步&#xff1a;服务端…

codeforces1451 C. String Equality

真的弱&#xff0c;这题都想蹦了。 这场md&#xff0c;b题看错题调了1小时才发现&#xff0c;c题上来也看错。。最后懒得写了睡觉~ C. String Equality 神的讲解 注意到连续k个相同字符才能使用操作二&#xff0c;不过我们可以交换&#xff0c;由此不难知道是否能够交换之和出…

YbtOJ#732-斐波那契【特征方程,LCT】

正题 题目链接:http://www.ybtoj.com.cn/contest/125/problem/2 题目大意 给出nnn个点的一棵树&#xff0c;以111为根&#xff0c;每个点有点权aia_iai​。要求支持mmm次操作 修改一个修改一个节点的父节点修改一条路径的权值为www给出uuu询问Fbi(au)Fbi(a_u)Fbi(au​)给出u…