题解

最小乘积生成树!

我们把,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

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <ctime>
#include <vector>
#include <set>
//#define ivorysi
#define eps 1e-8
#define mo 974711
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define fi first
#define se second
#define MAXN 10005
#define space putchar(' ')
#define enter putchar('\n')
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef unsigned long long u64;
typedef double db;
const int64 MOD = 1000000007;
template<class T>
void read(T &res) {res = 0;char c = getchar();T f = 1;while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}while(c >= '0' && c <= '9') {res = res * 10 + c - '0';c = getchar();}res *= f;
}
template<class T>
void out(T x) {if(x < 0) putchar('-');if(x >= 10) {out(x / 10);}putchar('0' + x % 10);
}
int N,M;
struct Point {int64 x,y;int64 v;Point(){};Point(int64 _x,int64 _y) {x = _x;y = _y;v = x * y;}friend bool operator < (const Point &a,const Point &b) {return a.v < b.v || (a.v == b.v && a.x < b.x);}
}ans;
struct Edge {int u,v;int64 c,t,w;Edge(){}Edge(int _u,int _v,int64 _c,int64 _t) {u = _u;v = _v;c = _c;t = _t;}friend bool operator < (const Edge &a,const Edge &b) {return a.w < b.w || (a.w == b.w && a.c < b.c);}
}E[MAXN];
int fa[205];
int getfa(int u) {return fa[u] == u ? u : fa[u] = getfa(fa[u]);
}
Point kruskal() {sort(E + 1,E + M + 1);Point res = Point(0,0);for(int i = 1 ; i <= N ; ++i) fa[i] = i;for(int i = 1 ; i <= M ; ++i) {if(getfa(E[i].u) != getfa(E[i].v)) {fa[getfa(E[i].u)] = getfa(E[i].v);res.x += E[i].c;res.y += E[i].t;}}res.v = res.x * res.y;if(res < ans) ans = res;return res;
}
void Work(Point A,Point B) {for(int i = 1 ; i <= M ; ++i) {E[i].w = (A.y - B.y) * E[i].c + (B.x - A.x) * E[i].t;}Point r = kruskal();if((A.x - r.x) * (B.y - r.y) - (A.y - r.y) * (B.x - r.x) >= 0) return;Work(A,r);Work(r,B);
}
void Solve() {read(N);read(M);int u,v;int64 c,t;for(int i = 1 ; i <= M ; ++i) {read(u);read(v);read(c);read(t);++u;++v;E[i] = Edge(u,v,c,t);}ans.v = 1e18;for(int i = 1 ; i <= M ; ++i) {E[i].w = E[i].c;}Point A = kruskal();for(int i = 1 ; i <= M ; ++i) {E[i].w = E[i].t;}Point B = kruskal();Work(A,B);printf("%lld %lld\n",ans.x,ans.y);
}
int main() {
#ifdef ivorysifreopen("f1.in","r",stdin);
#endifSolve();return 0;
}

转载于:https://www.cnblogs.com/ivorysi/p/9071158.html

【BZOJ】2395: [Balkan 2011]Timeismoney相关推荐

  1. 【BZOJ 2395】 [Balkan 2011]Timeismoney

    2395: [Balkan 2011]Timeismoney Time Limit: 10 Sec Memory Limit: 128 MB Submit: 304 Solved: 169 [Subm ...

  2. uboot环境下mmc操作_【记录】将Uboot 2011.06中mmc驱动移植到uboot 1.1.6的过程

    [记录]将Uboot 2011.06中mmc驱动移植到uboot 1.1.6的过程 时间:2011-8-14 作者:crifan 联系方式:green-waste (at) 163.com 附上代码: ...

  3. 【BZOJ】1707: [Usaco2007 Nov]tanning分配防晒霜

    [算法]贪心扫描线(+堆) [题意]给定n头牛有区间[a,b],m个防晒霜值为ai,每个可以使用bi次,每次可以使包含它的区间涂到防晒霜,问最多被涂牛数. [题解] 参考:[bzoj1707]: [U ...

  4. 【BZOJ】【1041】【HAOI2008】圆周上的点

    数学 orz hzwer 完全不会做-- 很纠结啊,如果将来再遇到这种题,还是很难下手啊-- 引用题解: [分析]: 样例图示: 首先,最暴力的算法显而易见:枚举x轴上的每个点,带入圆的方程,检查是否 ...

  5. 【BZOJ】【1036】树的统计

    嗯这题是一道对树进行动态修改&查询的经典题目,可以拿来练习树链剖分~ 啊对于这种动态修改&查询的题目,我们最喜闻乐见的就是在一个序列上去做了,毕竟可以直接套各种数据结构模版啊,比如线段 ...

  6. 【BZOJ】【3442】学习小组

    网络流/费用流 orz zyf 裸的费用流,根据题目描述即可建出如下的图: S->i 费用表示每有一个加入第 i 个小组的学生,需要花的钱,由于是跟流量(人数)的二次方相关,所以要拆边--然后每 ...

  7. 【BZOJ】1711: [Usaco2007 Open]Dining吃饭

    [算法]最大流 [题解] S连向食物连向牛连向牛'连向饮料连向T. 经典的一个元素依赖于两个元素的建图方式. #include<cstdio> #include<algorithm& ...

  8. 【BZOJ】2099: [Usaco2010 Dec]Letter 恐吓信

    [题意]给定长度为n和m的两个字符串S和T,要求在字符串S中取出若干段拼成T(可重复取),求最小段数,n,m<=50000. [算法]后缀自动机 || 后缀数组 [题解]对串S建SAM,然后在上 ...

  9. 【BZOJ】1299: [LLH邀请赛]巧克力棒

    [算法]博弈论 [题解]这道题不是典型的SG函数题了. 不把它当成游戏看待,那么这道题是在说n个石子堆,每次可以加入若干个或进行Nim游戏. 我们当前先手,则考虑构造必败态来获胜. 当前已加入的NIm ...

最新文章

  1. 中文latex去掉图片描述
  2. C#连接oracle的方式以及问题解决.
  3. 决定局域网的主要技术要素
  4. 弹出层之2:JQuery.BlockUI
  5. linux下raid5的配置
  6. spring mail 发送邮件
  7. Couchbase 2.0归类视图简介
  8. html知识笔记(三)——img标签、form表单
  9. spring boot报FileSizeLimitExceededException异常的解决方法
  10. 前端笔记-vue中使用router进行页面跳转及除掉url中的#
  11. discuz! 7.2 manyou插件暴路径Get Webshell 0day
  12. springboot整合使用rocketMq
  13. Linux面试常考(面经总结)
  14. 前端工作七个月经验总结以及技术分享
  15. 5G工业无线RTU TG511功能配置
  16. 直播安全体系、播放安全、推流安全以及内容安全方案分享
  17. 三个基本的布尔逻辑算符是_布尔逻辑算符.ppt
  18. Java数据结构---hashMap
  19. require() - NodeJS
  20. 【项目实战】基于Python的校园二手交易网站Django二手商城系统

热门文章

  1. PAT_B_1006_Java(15分)
  2. thinkphp python_ThinkPhp 5.0 服务器搭建问题总结
  3. 深度学习之卷积神经网络(7)池化层
  4. pythonnamedtuple定义类型_python-自定义type.NamedTuple
  5. 【sklearrn学习】朴素贝叶斯
  6. c语言 中多一个分号,问什么C程序里总是提示缺少分号;,而明明有分号?
  7. 状态压缩DP(大佬写的很好,转来看)
  8. 【人脸对齐-Landmarks】300W 数据集
  9. mysql explain中key_len值的说明
  10. 使用Python构建推荐系统的机器学习