正题

题目链接: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*k2u∗k1+v∗k2后求最小生成树。


解题思路

首先u∗k1+v∗k2⇒(u+v∗k2k1)∗k1u*k1+v*k2\Rightarrow (u+v*\frac{k2}{k1})*k1u∗k1+v∗k2⇒(u+v∗k1k2​)∗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=∣yl​−yr​∣,k2=∣xl​−xr​∣),然后分治下去处理(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);}
}

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

  1. UVA 1151 Buy or Build MST(最小生成树)

    题意: 在平面上有n个点,要让所有n个点都连通,所以你要构造一些边来连通他们,连通的费用等于两个端点的欧几里得距离的平方.另外还有q个套餐,可以购买,如果你购买了第i个套餐,该套餐中的所有结点将变得相 ...

  2. bzoj1937: [Shoi2004]Mst 最小生成树

    也是神了.感觉一天都在好神的题里面游荡. 本来是想复习一下KM的,结果一眼过去??? 结果做法是这样的,把树边和非树边分成两个集合 根据贪心的思想,要搞的话肯定树边减少,而非树边增加. 对于在原树中的 ...

  3. 【KM】BZOJ1937 [Shoi2004]Mst 最小生成树

    这道题拖了好久因为懒,结果1A了,惊讶∑( 口 || [题目大意] 给定一张n个顶点m条边的有权无向图.现要修改各边边权,使得给出n-1条边是这张图的最小生成树,代价为变化量的绝对值.求最小代价之和. ...

  4. BZOJ 1937: [Shoi2004]Mst 最小生成树 [二分图最大权匹配]

    传送门 题意: 给一张无向图和一棵生成树,改变一些边的权值使生成树为最小生成树,代价为改变权值和的绝对值,求最小代价 线性规划的形式: $Min\quad \sum\limits_{i=1}^{m} ...

  5. MST(最小生成树)的构造

    是什么: 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边. kruskal算法: #include<iostream> ...

  6. MST(最小生成树)上的确定性和存在性问题

    题目1: 给定一个n个点m条边的连通图,保证没有自环和重边.对于每条边求出,在其他边权值不变的情况下,它能取的最大权值,使得这条边在连通图的所有最小生成树上.假如最大权值为无限大,则输出-1. 题解: ...

  7. 【恋上数据结构】图代码实现、最小生成树(Prim、Kruskal)、最短路径(Dijkstra、Bellman-Ford、Floyd)

    图 最小生成树(Minimum Spanning Tree) Prim算法 切分定理 Prim算法 – 执行过程 Prim算法 – 代码实现 Kruskal算法 Kruskal算法 – 执行过程 Kr ...

  8. prim最小生成树算法 邻接表+STL实现

    一.预备知识 优先队列 二.代码: #include<iostream> #include<list> #include<vector> #include<m ...

  9. 求的带权图最小生成树的Prim算法和Kruskal算法

    求的带权图最小生成树的Prim算法和Kruskal算法 最小生成树的概念 最小生成树其实是最小权重生成树的简称. 一个连通图可能有多个生成树.当图中的边具有权值时,总会有一个生成树的边的权值之和小于或 ...

最新文章

  1. 将Select转变为支持输入内容对Select的Option进行筛选的js
  2. BFS HDOJ 2102 A计划
  3. 日常问题解决记录三:记一次Win10安装Oracle11g后遇到的问题
  4. python后端程序例子_Python MR程序示例
  5. alexa工具条下载_如何聆听(和删除)您给Alexa的每条命令
  6. 4 配置端口聚合提供冗余备份链路
  7. 白话区块链~Pow,PoS,DPos
  8. OSI七层模型与TCP/IP五层模型
  9. filp/whoops
  10. 一天一个设计模式---备忘录模式
  11. 项目管理 | 如何正确的向领导汇报工作?
  12. 纯干货!短视频脚本怎么写?零基础新手小白也能写好短视频脚本!【覃小龙课堂】
  13. Koreographer音乐插件基本使用
  14. 图片批量压缩变小的办法
  15. lammps案例:聚乙烯/石墨烯侧面pull out模拟案例
  16. Oracle 常用函数总结(持续更新)
  17. XGBoost原理及目标函数推导详解
  18. 一文教你玩LED点阵屏32*64/64*64----基于STM32
  19. 计算机丢失d3dx9_43.dll怎么办,d3dx9_43.dll放在哪?丢失d3dx9_43.dll解决办法
  20. CData Drivers for DocuSign Crack

热门文章

  1. python docx 字体大小_聊聊python办公自动化之Word(上)
  2. mysql innodb事务中_MySQL InnoDB如何保证事务特性示例详解
  3. python ctp接口_使用ctp的python接口
  4. mysql判断表存在的sql语句_SQL 语句判断已知表是否存在_MySQL
  5. mysql如何和qt连接使用_Qt5学习:连接MySQL数据库
  6. layui上传报错会有哪些原因_一到冬天,为什么会比别人更怕冷?有哪些原因?...
  7. python函数模块化教程_【软件测试教程】Python模块化以及内置模块的使用
  8. leetcode844. 比较含退格的字符串
  9. Java实现线性表(顺序表,链表)
  10. linux连接http报301解决,https下不加www的301强制跳转