jzoj3860-地壳运动(mst)【最小生成树,三分】

正题

题目链接:https://jzoj.net/senior/#contest/show/3002/1


题目大意

nnn个点mmm条边,每条边有(u,v)(u,v)(u,v)两个权值。

qqq个询问,每次询问一个(k1,k2)(k1,k2)(k1,k2),将所有边的权值变为u∗k1+v∗k2u*k1+v*k2uk1+vk2后求最小生成树。


解题思路

首先u∗k1+v∗k2⇒(u+v∗k2k1)∗k1u*k1+v*k2\Rightarrow (u+v*\frac{k2}{k1})*k1uk1+vk2(u+vk1k2)k1,所以决策可以线性表示出来。

我们考虑维护一个坐标系(x,y)(x,y)(x,y)表示uuu值和为xxx的生成树中yyy值和最小是多少。

显然xxx增大时yyy在减小,所以这是一个下突壳。

考虑维护这一个突壳,首先是两个端点l:(k1=0,k2=1)l:(k1=0,k2=1)l:(k1=0,k2=1)时和r:(k1=1,k2=0)r:(k1=1,k2=0)r:(k1=1,k2=0)各做一次最小生成树,此时我们考虑找到一个在线段(l,r)(l,r)(l,r)的左下角最远的点midmidmid

通过差积各种证明后我们发现有mid(k1=∣yl−yr∣,k2=∣xl−xr∣)mid(k1=|y_l-y_r|,k2=|x_l-x_r|)mid(k1=ylyr,k2=xlxr),然后分治下去处理(l,mid)(l,mid)(l,mid)(r,mid)(r,mid)(r,mid)

midmidmid在线段(l,r)(l,r)(l,r)上时,证明左下角已经没有更优的点,所以可以返回了。

最后在突壳上三分答案就好了。


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int M=25100,N=40;
struct node{int x,y;double u,v;
}a[M];
struct knode{double k1,k2,x,y;
}k[M*4],head,tail;
int n,m,q,fa[N],tot;
double k1,k2;
int find(int x)
{return fa[x]==x?x:(fa[x]=find(fa[x]));}
bool cmp(node x,node y)
{return x.u*k1+x.v*k2<y.u*k1+y.v*k2;}
void Get_Tree(knode &k){k1=k.k1;k2=k.k2;k.x=k.y=0;sort(a+1,a+1+m,cmp);for(int i=1;i<=n;i++)fa[i]=i;int z=n;for(int i=1;i<=m;i++){int fx=find(a[i].x),fy=find(a[i].y);if(fx!=fy){if(fx>fy) swap(fx,fy);fa[fy]=fx;z--;k.x+=a[i].u;k.y+=a[i].v;}}return;
}
void Solve(knode l,knode r){knode mid;mid.k1=fabs(r.y-l.y);mid.k2=fabs(r.x-l.x);Get_Tree(mid);if(l.y==mid.y||l.y==r.y||(l.x-r.x)/(l.y-r.y)==(l.x-mid.x)/(l.y-mid.y))return;Solve(l,mid);k[++tot]=mid;Solve(mid,r);
}
int main()
{scanf("%d%d%d",&n,&m,&q);for(int i=1;i<=m;i++)scanf("%d%d%lf%lf",&a[i].x,&a[i].y,&a[i].u,&a[i].v);head.k1=1;tail.k2=1;Get_Tree(head);Get_Tree(tail);k[tot=1]=head;Solve(head,tail);k[++tot]=tail;while(q--){scanf("%lf%lf",&k1,&k2);int l=1,r=tot;double ans=1e18;while(l<r){if(r-l<=2)break;int mid1=l+(r-l+1)/3,mid2=l+(r-l+1)/3*2;if(k[mid1].x*k1+k[mid1].y*k2<k[mid2].x*k1+k[mid2].y*k2) r=mid2;else l=mid1;}for(int i=l;i<=r;i++)ans=min(k[i].x*k1+k[i].y*k2,ans);printf("%.3lf\n",ans);}
}

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

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

相关文章

读人人都是产品经理__2

1、做产品和做项目 对产品经理来说&#xff0c;最重要的是判断力和创造力&#xff0c;产品经理决定做不做、做什么&#xff0c;保证方向正确&#xff0c;要把它实现。对项目经理来说&#xff0c;最终的是执行力和控制力&#xff0c;项目经理决定怎么做&#xff0c;谁来做&#…

业务配置开发平台qMISPlat 2.0 产品介绍

qMISPlat是什么qMISPlat(业务配置开发平台)是一套基于.net core 2.0、跨平台的&#xff0c;面向开发人员和具有一定技术水平的业务人员使用的业务配置开发平台。基于此平台您只需通过配置和少量开发即可快速搭建满足用户需求的业务系统&#xff0c;大大降低项目开发工作量。平台…

jzoj2755-[2012东莞市选]树的计数【dp,高精度】

正题 题目链接:https://jzoj.net/senior/#main/show/2755 题目大意 求有多少个nnn个点直径为ddd的标号树。 解题思路 定义fi,jf_{i,j}fi,j​表示iii个点&#xff0c;深度不超过jjj的标号树数量。 然后有转移fi,j∑k1i−1Ci−2k−1∗k∗fk,j−1∗fi−k,jf_{i,j}\sum_{k1}^{i…

2、异步HTTP编程

1、处理异步结果 在内部&#xff0c;play框架是自下而上异步的。Play以异步、非阻塞方式处理每个请求。应用程序代码应尽量避免阻塞控制器&#xff0c;这种阻塞操作的常见例子有JDBC调用、流式API、HTTP请求和长计算。因此应尽量通过保持控制器异步的方法使得应用进行扩展&…

【动态规划】最大子矩阵之和

最大子矩阵 Description 给出一个N [2<N<100]&#xff0c;并给出一个N*N的矩阵&#xff0c;矩阵中的数为[-127,127]之间。求出矩阵中一块子矩阵的最大和。 比如&#xff1a; 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 和最大的子矩阵应该是这个&#xff1a; 9 2 …

3、play中的模板引擎

1、模板格式 Play默认的模板引擎是一种基于scala的安全模板引擎&#xff0c;尽管模板引擎使用Scala作为表达式语言&#xff0c;但是非常简单易学。参数类型使用后缀语法指定&#xff08;例如&#xff1a; id&#xff1a;Long&#xff09;&#xff0c;泛型类型是使用[]符号&…

jzoj3500-物语【最短路】

正题 题目链接:https://jzoj.net/senior/#contest/show/3005/0 题目大意 nnn个点mmm条边的无向图&#xff0c;有一条边的边权会变化&#xff0c;qqq次变化&#xff0c;每次询问最短路。 解题思路 可变边(x,y)(x,y)(x,y) 路径无非就三种 1−>n1->n1−>n1−>x−>…

Problem G. Graph 2015-2016 acmicpc neerc 拓扑排序模拟

一道好题 题目详见题目连接G graph 显然模拟拓扑排序的步骤是必不可少了。 假设我们当前有t个点&#xff0c;他们的入度均为0.我们不知道该选取哪一个。 我们把这t个点按从小到大排好序&#xff08;放入小顶堆&#xff09;&#xff0c;假设我们目前有k条边&#xff08;k &l…

【动态规划】石子合并

石子合并石子合并石子合并 Description 在一个操场上一排地摆放着N堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆&#xff0c;并将新的一堆石子数记为该次合并的得分。请设计一个程序&#xff0c;计算出将N堆石子合并成一堆的最小得分。…

.NET Core调用WCF的最佳实践

现在.NET Core貌似很火&#xff0c;与其他.NET开发者交流不说上几句.NET Core都感觉自己落伍了一样。但是冷静背后我们要也看到.NET Core目前还有太多不足&#xff0c;别的不多说&#xff0c;与自家的服务框架WCF集成起来就不咋地&#xff0c;从最初不支持&#xff0c;到现在有…

4、表单提交和验证

1、启用/禁用表单module sbt启动应用时默认就启用了表单&#xff0c;也可以在build.sbt中添加启用libraryDependencies javaForms&#xff0c;想要移除表单时使用PlayMinimalJava 插件 2、play接收表单数据 play.data中的类可用于处理HTTP表单数据提交和验证&#xff0c;操…

Boring Homework 二叉搜索树的打印,模拟

写了好长时间&#xff0c;注意递归的使用&#xff0c;思路一定要清晰。 还有注意的地方&#xff1a;打印的时候一定要先打印到缓存buffer中&#xff0c;然后再输出到屏幕上面。 #include <bits/stdc.h> using namespace std; int idx 0; int val[100],lft[100],rgt[100…

jzoj3501-消息传递【换根法,树形dp】

正题 题目链接:https://jzoj.net/senior/#contest/show/3005/1 题目大意 一棵树&#xff0c;一个信息开始给一个人&#xff0c;每次得到信息的人可以选择相邻节点中的一个传递&#xff0c;求最短多久可以传到所有人。 解题思路 我们先考虑如何求一根的答案&#xff0c;farif…

【贪心】最佳浏览路线问题

最佳浏览路线问题最佳浏览路线问题最佳浏览路线问题 题目描述 某旅游区的街道成网格状&#xff08;见图&#xff09;&#xff0c;其中东西向的街道都是旅游街&#xff0c;南北向的街道都是林荫道。由于游客众多&#xff0c;旅游街被规定为单行道。游客在旅游街上只能从西向东…

Ooui:在浏览器中运行.NET应用

在过去数年中&#xff0c;桌面应用开发人员一直处境艰难&#xff0c;因为人们的主要关注点聚焦于Web和移动应用。由于Microsoft未来Windows平台的计划未定&#xff0c;并且UWP应用也没有突破性进展&#xff0c;因此技术落伍的责任也不应由.NET开发人员来承担。当前迫切需要解决…

5、play中的json数据处理

1、play中的json库 Play使用Jackson JSON库将对象转换为JSON和JSON之间的对象。play的操作使用JsonNode类型&#xff0c;play.libs.json包中有操作json数据的方法 2、java对象和json数据 将java对象转成play中的JsonNode类型&#xff1a; 将JsonNode格式的数据解析到java对象…

P2354,jzoj3757-[NOI2014]随机数生成器【贪心,暴力】

正题 题目链接:https://www.luogu.com.cn/problem/P2354 解题思路 以1∼n∗m1\sim n*m1∼n∗m的数字组成的n∗mn*mn∗m的矩阵&#xff0c;求一条路径使得路径上的数排序后字典序最小。 解题思路 考虑从小到大依次枚举来判断是否可行。 每次判断一个点是否可以经过然后加入一…

Detection of Extraterrestrial KMP匹配 重复k次子串 好题

一开始以为这道题是后缀数组&#xff0c;想了好久没想明白怎么做&#xff0c;后来发现暴力枚举起点&#xff0c;进行KMP就好了。 枚举起点以后&#xff0c;构建fail数组。 遍历fail数组&#xff0c;如果串s[l,r]是由串s[s,t]重复k次得到的&#xff0c;那么fail数组的样子一定…

【贪心】最大连续数列的和

最大连续数列的和最大连续数列的和最大连续数列的和 题目描述 求最大连续子序列的和 输入 第一行输入n(n<500),第二行为n个以空格分开的整数(-1000到1000之间) 输出 该序列中最大的连续子序列的和 输入样例 &#xff16; 1 2 -5 6 7 8 输出样例 21 解题思路 用…

农行基于TFS工具的敏捷转型实践

““春天工程”项目组是应用开发二部最早采用敏捷模式的项目组&#xff0c;项目组在项目推进过程中使用Scrum框架&#xff0c;结合“看板站会”形式&#xff0c;积极探索项目推进新措施。结合TFS工具逐步实现了电子工具与物理看板的有机融合&#xff0c;并在过程管理、版本管理…