CF536C-Tavas and Pashmaks【凸壳】
时间:2021-10-07
本文章向大家介绍CF536C-Tavas and Pashmaks【凸壳】,主要包括CF536C-Tavas and Pashmaks【凸壳】使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
正题
题目链接:https://codeforces.com/contest/536/problem/C
题目大意
\(n\)个人,第\(i\)个人的游泳速度\(s_i\),跑步速度是\(r_i\)。如果跑道长度是\(R\),泳道长度是\(S\)那么一个人的用时就是\(\frac{R}{r_i}+\frac{S}{s_i}\),在\(R/S\)不定的情况下然后求出所有可能是用时最短的人。
\(1\leq n\leq 10^5,1\leq s_i,r_i\leq 10^4\)
解题思路
设\(k=\frac{R}{S}\),那么用时可以化为\(\frac{k}{r_i}+\frac{1}{s_i}\)。
然后对于一个点\((-\frac{1}{r_i},\frac{1}{s_i})\),我们可以视为用一条斜率为\(k\)的斜线去截这些点然后让截距最小。
直接维护一个凸壳就好了,然后注意因为\(R/S\)都是正数所以\(k\)也得是正数,所以要把后段丢掉。
时间复杂度:\(O(n\log n)\)
当然还有一个更神奇的做法,因为对于一个\(s_i\)我们只需要最大的\(r_i\)所以有用的点数不超过\(10^4\),可以直接平方暴算。
code
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+10;
const double eps=1e-8;
struct node{
double x,y;int id;
}q[N];
int n,top,s[N],ans[N],l[N];
bool cmp(node x,node y)
{return (x.x==y.x)?(x.y>y.y):(x.x<y.x);}
double slope(node a,node b)
{return (b.y-a.y)/(b.x-a.x);}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
double x,y;q[i].id=i;
scanf("%lf%lf",&x,&y);
q[i].x=1e5/x;q[i].y=1e5/y;
}
sort(q+1,q+1+n,cmp);
for(int i=1;i<=n;i++)
if(q[i].x==q[i-1].x&&q[i].y==q[i-1].y)l[i]=l[i-1];
else l[i]=i;
for(int i=1;i<=n;i++){
if(q[i].x==q[i+1].x)continue;
while(top>1&&slope(q[s[top-1]],q[s[top]])-eps>slope(q[s[top-1]],q[i]))top--;
s[++top]=i;
}
for(int i=1;i<=top;i++){
for(int j=l[s[i]];j<=s[i];j++)
ans[q[j].id]=1;
if(q[s[i]].y<=q[s[i+1]].y)break;
}
for(int i=1;i<=n;i++)
if(ans[i])printf("%d ",i);
return 0;
}
原文地址:https://www.cnblogs.com/QuantAsk/p/15377179.html
- 深入理解JavaScript原型:prototype,__proto__和constructor
- Comparable 与 Comparator 浅析
- 必应首页平铺背景图片的实现方案
- 我们是如何优化HAProxy以让其支持200万个并发SSL连接的?
- 【译】《Understanding ECMAScript6》- 第八章-Module
- 【译】《Understanding ECMAScript6》- 第七章-Promise
- 自定义gradview
- Redis 起步
- JVM参数详解及OOM
- 【译】《Understanding ECMAScript6》- 第五章-Class
- 【译】《Understanding ECMAScript6》- 第三章-Object
- 【译】《Understanding ECMAScript6》- 第二章-函数
- 【译】《Understanding ECMAScript6》- 第一章-基础知识(二)
- 【译】《Understanding ECMAScript6》- 第一章-基础知识(一)
- 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 数组属性和方法
- LoRa终端设备ASR6505驱动DHT11
- Mysql系列第七讲 玩转select条件查询,避免采坑
- Mysql第六讲 select查询基础篇
- Mybatis系列第四讲 Mybatis使用详解(2)
- 大型项目技术栈第八讲 Redis
- 大型项目技术栈第七讲 Chosen的使用
- 大型项目技术栈第六讲 EasyExcel的使用
- JavaWeb第二讲 重定向与转发 & doGet()与doPost()
- JavaWeb第一讲 Servlet的工作原理及生命周期
- 多系列数据核密度图
- leetcode树之二叉树的层平均值
- 大型项目技术栈第二讲 ES6(ECMAScript 6.0)的使用
- 大型项目技术栈第三讲 ztree的使用
- JavaWeb新手训练经典项目 & 半小时高效开发 & 海量知识点涵盖 = 从这里开始
- Java反射_笔记分享