BZOJ 3716 [PA2014]Muzeum 贪心SET最大闭合子图
时间:2019-10-24
本文章向大家介绍BZOJ 3716 [PA2014]Muzeum 贪心SET最大闭合子图,主要包括BZOJ 3716 [PA2014]Muzeum 贪心SET最大闭合子图使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
看上去像是一个最大权闭合子图裸题但是数据太大
我们可以先把守卫的视野转换到第二象限(每个守卫可以看到横坐标比他小 纵坐标比他大的宝物) 然后按X从小到大 再按Y从大到小排
这样我们就可以按SORT序遍历守卫 然后贪心地把每个守卫的流量流给离他最近的Y最小的宝物 易证这样是最优的
#include<bits/stdc++.h> #define ll long long using namespace std; inline void read(int &x) { char c; int f = 1; while (!((c = getchar()) >= '0' && c <= '9')) if (c == '-') f = -1; x = c - '0'; while ((c = getchar()) >= '0' && c <= '9') (x *= 10) += c - '0'; if (f == -1) x = -x; } const int maxn = 810000; const double eps = 1e-9; int n, m, N, w, h; struct node { double x, y; int i, c; } X, Y, a[maxn]; inline bool operator <(const node x, const node y) { return x.y - y.y > eps; } inline bool cmp(const node x, const node y) {//按横坐标从小到大,纵坐标从大到小排序 if (fabs(x.x - y.x) < eps) return x.y - y.y < -eps; return x.x - y.x < -eps; } multiset<node>S; multiset<node>::iterator it, it2; node generate(int x, int y) { //视野转换为第二象限 double A = ((double)x / w - (double)y / h) / 2.0; double B = A - (double)x / w; return (node) { -A, -B, 0, 0 }; } ll re; int main() { read(n); read(m); N = n + m; read(w); read(h); //X=(node){w,-h}; //Y=(node){-w,-h}; for (int i = 1; i <= n; i++) { int x, y, c; read(x); read(y); read(c); a[i] = generate(x, y); a[i].i = i; a[i].c = c; re += c; } for (int i = 1; i <= m; i++) { int x, y, c; read(x); read(y); read(c); a[n + i] = generate(x, y); a[n + i].i = n + i; a[n + i].c = c; } sort(a + 1, a + N + 1, cmp); for (int i = 1; i <= N; i++) { if (a[i].i <= n) S.insert(a[i]); else { it = S.lower_bound(a[i]); while (it != S.end() && a[i].c) { it2 = it; it2++; //指向下一个 if (a[i].c < (*it).c) { node tmp = (*it); tmp.c -= a[i].c; re -= a[i].c; S.erase(it); S.insert(tmp); break; } a[i].c -= (*it).c; re -= (*it).c; S.erase(it); it = it2; } } } printf("%lld\n", re); return 0; }
原文地址:https://www.cnblogs.com/Aragaki/p/11730877.html
- 【翻译】JavaScript内存泄露
- 【翻译】ES6生成器简介
- 浅谈事件冒泡
- Github page搭建博客使用自定义插件的方法
- 【翻译】JavaScript中5个值得被广泛使用的数组方法
- 【翻译】浏览器渲染Rendering那些事:repaint、reflow/relayout、restyle
- Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制
- 《JQuery技术内幕》读书笔记——自调用匿名函数剖析
- 【代码+论文】通过ML、Time Series模型学习股价行为
- .NET Core 系列5 :使用 Nuget打包类库
- 解决transition动画与display冲突的几种方法
- Gof设计模式之装饰者模式(七)
- JavaScript递归中的作用域问题
- constructor属性解析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 浙大版《C语言程序设计(第3版)》题目集 习题4-10 猴子吃桃问题
- 6种展示代码的绝佳方式
- 你电脑里的IE浏览器正在被黑客利用
- 浙大版《C语言程序设计(第3版)》题目集 习题6-8 统计一行文本的单词个数
- 浙大版《C语言程序设计(第3版)》题目集 练习7-2 求最大值及其下标
- 浙大版《C语言程序设计(第3版)》题目集 练习7-3 将数组中的数逆序存放
- CycleGan人脸转为漫画脸,牛掰的知识又增加了!| 附代码
- 浙大版《C语言程序设计(第3版)》题目集 练习7-4 找出不是两个数组共有的元素
- 浙大版《C语言程序设计(第3版)》题目集 练习7-7 矩阵运算
- 系统之眼!Linux系统性能监控工具Glances
- 浙大版《C语言程序设计(第3版)》题目集 练习7-8 方阵循环右移
- 浙大版《C语言程序设计(第3版)》题目集 练习7-9 计算天数
- 浙大版《C语言程序设计(第3版)》题目集 练习7-10 查找指定字符
- 浙大版《C语言程序设计(第3版)》题目集 练习7-11 字符串逆序
- 浙大版《C语言程序设计(第3版)》题目集 习题7-1 选择法排序