题解

最小乘积生成树!

我们把,x的总和和y的总和作为x坐标和y左边,画在坐标系上

我们选择两个初始点,一个是最靠近y轴的A,也就是x总和最小,一个是最靠近x轴的B,也就是y总和最小

连接两条直线,在这条直线上面的点都不用考虑了

我们选一个离直线最远的点C,且在直线下方,我们用叉积考虑这个东西,也就是……面积最大!我们如果用最小生成树的话,只要让面积是负的就好了

推一下式子,发现是\((A.y - B.y) * C.x + (B.x - A.x) * C.y\)我们发现就是把边设置成

\((A.y - B.y) * E[i].c + (B.x - A.x) * E[i].t\)做一遍最小生成树

找到C点后递归处理A,C和C,B即可

边界是两点连线下方没有点也就是叉积大于等于0

代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <ctime>
  7. #include <vector>
  8. #include <set>
  9. //#define ivorysi
  10. #define eps 1e-8
  11. #define mo 974711
  12. #define pb push_back
  13. #define mp make_pair
  14. #define pii pair<int,int>
  15. #define fi first
  16. #define se second
  17. #define MAXN 10005
  18. #define space putchar(' ')
  19. #define enter putchar('\n')
  20. using namespace std;
  21. typedef long long int64;
  22. typedef unsigned int u32;
  23. typedef unsigned long long u64;
  24. typedef double db;
  25. const int64 MOD = 1000000007;
  26. template<class T>
  27. void read(T &res) {
  28. res = 0;char c = getchar();T f = 1;
  29. while(c < '0' || c > '9') {
  30. if(c == '-') f = -1;
  31. c = getchar();
  32. }
  33. while(c >= '0' && c <= '9') {
  34. res = res * 10 + c - '0';
  35. c = getchar();
  36. }
  37. res *= f;
  38. }
  39. template<class T>
  40. void out(T x) {
  41. if(x < 0) putchar('-');
  42. if(x >= 10) {
  43. out(x / 10);
  44. }
  45. putchar('0' + x % 10);
  46. }
  47. int N,M;
  48. struct Point {
  49. int64 x,y;
  50. int64 v;
  51. Point(){};
  52. Point(int64 _x,int64 _y) {
  53. x = _x;y = _y;v = x * y;
  54. }
  55. friend bool operator < (const Point &a,const Point &b) {
  56. return a.v < b.v || (a.v == b.v && a.x < b.x);
  57. }
  58. }ans;
  59. struct Edge {
  60. int u,v;
  61. int64 c,t,w;
  62. Edge(){}
  63. Edge(int _u,int _v,int64 _c,int64 _t) {
  64. u = _u;v = _v;c = _c;t = _t;
  65. }
  66. friend bool operator < (const Edge &a,const Edge &b) {
  67. return a.w < b.w || (a.w == b.w && a.c < b.c);
  68. }
  69. }E[MAXN];
  70. int fa[205];
  71. int getfa(int u) {
  72. return fa[u] == u ? u : fa[u] = getfa(fa[u]);
  73. }
  74. Point kruskal() {
  75. sort(E + 1,E + M + 1);
  76. Point res = Point(0,0);
  77. for(int i = 1 ; i <= N ; ++i) fa[i] = i;
  78. for(int i = 1 ; i <= M ; ++i) {
  79. if(getfa(E[i].u) != getfa(E[i].v)) {
  80. fa[getfa(E[i].u)] = getfa(E[i].v);
  81. res.x += E[i].c;res.y += E[i].t;
  82. }
  83. }
  84. res.v = res.x * res.y;
  85. if(res < ans) ans = res;
  86. return res;
  87. }
  88. void Work(Point A,Point B) {
  89. for(int i = 1 ; i <= M ; ++i) {
  90. E[i].w = (A.y - B.y) * E[i].c + (B.x - A.x) * E[i].t;
  91. }
  92. Point r = kruskal();
  93. if((A.x - r.x) * (B.y - r.y) - (A.y - r.y) * (B.x - r.x) >= 0) return;
  94. Work(A,r);
  95. Work(r,B);
  96. }
  97. void Solve() {
  98. read(N);read(M);
  99. int u,v;
  100. int64 c,t;
  101. for(int i = 1 ; i <= M ; ++i) {
  102. read(u);read(v);read(c);read(t);
  103. ++u;++v;
  104. E[i] = Edge(u,v,c,t);
  105. }
  106. ans.v = 1e18;
  107. for(int i = 1 ; i <= M ; ++i) {
  108. E[i].w = E[i].c;
  109. }
  110. Point A = kruskal();
  111. for(int i = 1 ; i <= M ; ++i) {
  112. E[i].w = E[i].t;
  113. }
  114. Point B = kruskal();
  115. Work(A,B);
  116. printf("%lld %lld\n",ans.x,ans.y);
  117. }
  118. int main() {
  119. #ifdef ivorysi
  120. freopen("f1.in","r",stdin);
  121. #endif
  122. Solve();
  123. return 0;
  124. }

【BZOJ】2395: [Balkan 2011]Timeismoney的更多相关文章

  1. BZOJ 2395 [Balkan 2011]Timeismoney(最小乘积生成树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2395 [题目大意] 给出一张无向图,每条边上有a,b两个值,求生成树, 使得suma* ...

  2. bzoj 2395: [Balkan 2011]Timeismoney【计算几何+最小生成树】

    妙啊,是一个逼近(?)的做法 把两个值最为平面上的点坐标,然后答案也是一个点. 首先求出可能是答案的点xy分别是按照c和t排序做最小生成树的答案,然后考虑比这两个点的答案小的答案,一定在xy连线靠近原 ...

  3. 【最小乘积生成树】bzoj2395[Balkan 2011]Timeismoney

    设每个点有x,y两个权值,求一棵生成树,使得sigma(x[i])*sigma(y[i])最小. 设每棵生成树为坐标系上的一个点,sigma(x[i])为横坐标,sigma(y[i])为纵坐标.则问题 ...

  4. @bzoj - 2395@ [Balkan 2011]Timeismoney

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 有n个城市(编号从0..n-1),m条公路(双向的),从中选择n ...

  5. bzoj 2395 [Balkan 2011]Timeismoney——最小乘积生成树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2395 如果把 \( \sum t \) 作为 x 坐标,\( \sum c \) 作为 y ...

  6. 【BZOJ2395】[Balkan 2011]Timeismoney

    [BZOJ2395][Balkan 2011]Timeismoney 题面 \(darkbzoj\) 题解 如果我们只有一个条件要满足的话直接最小生成树就可以了,但是现在我们有两维啊... 我们将每个 ...

  7. 【BZOJ】3052: [wc2013]糖果公园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...

  8. 【BZOJ】3319: 黑白树

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...

  9. 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...

随机推荐

  1. Postman简明教程

    一.Postman简介 Postman是一款接口测试工具,常用于日常工作的接口类功能测试和简单的自动化测试. 二.Postman功能介绍 1.常见get请求的接口测试 我们现在有这样一个获取学生信息的 ...

  2. Spring Aop、拦截器、过滤器的区别

    Filter过滤器:拦截web访问url地址.Interceptor拦截器:拦截以 .action结尾的url,拦截Action的访问.Spring AOP拦截器:只能拦截Spring管理Bean的访 ...

  3. HDU 1259 ZJUTACM

    解题报告:就用了一个swap函数就行了. #include<cstdio> #include<iostream> int main() { int x,y,T,n; scanf ...

  4. opencv的基本数据结构(一)(转)

    从2001年以来,opencv的函数库一直是基于C接口构建的,因此在opencv1.0版本中,一般使用IplImage的C结构体在内存中存储图像,因此,我们在很多较经典的书籍或者开源项目中依然可见Ip ...

  5. POJ 2230 Watchcow && USACO Watchcow 2005 January Silver (欧拉回路)

    Description Bessie's been appointed the new watch-cow for the farm. Every night, it's her job to wal ...

  6. def 的传参数的问题

    测试了一下.关于python 的函数def里面的传参数问题: 1.传参顺序: # codig:utf-8 def function(a,b=1,*args,**kwargs): print(a,'\n ...

  7. DataTable转任意类型对象List数组-----工具通用类(利用反射和泛型)

    public class ConvertHelper<T> where T : new() { /// <summary> /// 利用反射和泛型 /// </summa ...

  8. 最小生成树 kuangbin专题最后一个题

    题目链接:https://cn.vjudge.net/contest/66965#problem/N 注释:这道题需要用krustra,用prim的话可能会超时.并且在计算距离的时候要尽量减少步骤,具 ...

  9. 20165230 2017-2018-2 《Java程序设计》第7周学习总结

    20165230 2017-2018-2 <Java程序设计>第7周学习总结 教材学习内容总结 第十一章 JDBC与MySQL数据库 本周了解了如何在Java程序中使用JDBC语提供的AP ...

  10. 浅析Postgres中的并发控制(Concurrency Control)与事务特性(上)

    转载:https://www.cnblogs.com/flying-tiger/p/9567213.html#4121483#undefined PostgreSQL为开发者提供了一组丰富的工具来管理 ...