牛客第二场 C.message(计算几何+二分)
题目传送:https://www.nowcoder.com/acm/contest/140/C
题意:有n个云层,每个云层可以表示为y=ax+b。每个飞机的航线可以表示为时间x时,坐标为(x,cx+d)。问飞机旅程与最后一个云层相交的x坐标。不存在
分析:
可以确定两直线联立后解得交点x=(b-d)/(a-c)。
可以看做是点(a,b)和(c,d)的斜率的负数。
要求的最大的x,那么就变成了求得最小的斜率,答案最后再乘-1即可。
就是求每个(c,d)点到(a,b)的斜率,可以把每一个(a,b)看成一个点,求凸包。
每碰到一个(c,d)二(san)分到凸包上的点的斜率。维护最小值。
#include<bits/stdc++.h>
using namespace std;
const double eps=1e-;
const double inf=1e20;
const int maxn=1e5+;
int sgn(double x){
if (fabs(x)<eps) return ;
if (x<) return -;
return ;
}
struct point{
double x,y;
int id; double ans;
point(){}
point(double _x,double _y):x(_x),y(_y){}
point operator +(const point &b)const{
return point(x+b.x,y+b.y);
}
point operator -(const point &b)const{
return point(x-b.x,y-b.y);
}
double operator ^(const point &b)const{
return x*b.y-y*b.x;
}
bool operator <(const point &b)const{
if (sgn(x-b.x)==) return y<b.y;
return x<b.x;
}
}; point p[maxn],pp[maxn];
int n,m;
double calc(point a,point b){
if (sgn(a.x-b.x)==) return 1.0;
return (a.y-b.y)/(a.x-b.x);
}
double cross(point p,point a,point b){
return (a-p)^(b-p);
}
void convex_hull(point p[],int N,point q[]){
sort(p,p+N);
int m=;
for (int i=;i<N;i++){
if (p[i].id>n){
if (m==) continue;
int l=,r=m-,mid;
while (l<r){
mid=(l+r)>>;
if (calc(p[i],q[mid])<calc(p[i],q[mid+])){
l=mid;
}
else r=mid-;
}
p[i].ans=min(p[i].ans,calc(p[i],q[l]));
}
else{
while (m> && cross(q[m-],q[m-],p[i])<=) m--;
q[m++]=p[i];
}
}
int k=m;
for (int i=N-;i>=;i--){
if (p[i].id>n){
if (m==k) continue;
int l=,r=m-,mid;
while (l<r){
mid=(l+r)>>;
if (calc(p[i],q[mid])<calc(p[i],q[mid+])){
l=mid;
}
else r=mid-;
}
p[i].ans=min(p[i].ans,calc(p[i],q[l]));
}
else{
while (m>k && cross(q[m-],q[m-],p[i])<=) m--;
q[m++]=p[i];
}
}
}
bool cmp(point a,point b){
return a.id<b.id;
}
int main(){
cin >> n;
for (int i=;i<n;i++){
cin >> p[i].x >> p[i].y;
p[i].id=i+; p[i].ans=inf;
}
cin >> m;
for (int i=n;i<n+m;i++){
cin >> p[i].x >> p[i].y;
p[i].id=i+; p[i].ans=inf;
}
convex_hull(p,n+m,pp);
for (int i=;i<n+m;i++){p[i].x*=-; p[i].y*=-;}
convex_hull(p,n+m,pp);
sort(p,p+n+m,cmp);
for (int i=n;i<n+m;i++)
if (p[i].ans>=) cout << "No cross\n";
else printf("%.7f\n",-p[i].ans);
return ;
}
牛客第二场 C.message(计算几何+二分)的更多相关文章
- 牛客第二场Dmoney
链接:https://www.nowcoder.com/acm/contest/140/D 来源:牛客网 题目描述 White Cloud has built n stores numbered to ...
- 牛客第二场A-run
链接:https://www.nowcoder.com/acm/contest/140/A 来源:牛客网 White Cloud is exercising in the playground. Wh ...
- 牛客第二场 J farm
White Rabbit has a rectangular farmland of n*m. In each of the grid there is a kind of plant. The pl ...
- 牛客第二场-J-farm-二维树状数组
二维树状数组真的还挺神奇的,更新也很神奇,比如我要更新一个区域内的和,我们的更新操作是这样的 add(x1,y1,z); add(x2+1,y2+1,z); add(x1,y2+1,-z); add( ...
- 第k小团(Bitset+bfs)牛客第二场 -- Kth Minimum Clique
题意: 给你n个点的权值和连边的信息,问你第k小团的值是多少. 思路: 用bitset存信息,暴力跑一下就行了,因为满足树形结构,所以bfs+优先队列就ok了,其中记录下最后进入的点(以免重复跑). ...
- 走环概率问题(至今有点迷)--牛客第二场( Eddy Walker)
思路: 概率结论题,好像属于线性递推,现在也不太懂(lll¬ω¬) #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include < ...
- 2020牛客暑期多校训练营 第二场 B Boundary 计算几何 圆 已知三点求圆心
LINK:Boundary 计算几何确实是弱项 因为好多东西都不太会求 没有到很精通的地步. 做法很多,先说官方题解 其实就是枚举一个点 P 然后可以发现 再枚举一个点 然后再判断有多少个点在圆上显然 ...
- 牛客网暑期ACM多校训练营(第二场)message
传送门:https://ac.nowcoder.com/acm/problem/16631 题意 对于直线y=ax+b,给出n个的a[i]和b[i].m次询问,每次询问给出直线y=cx+d的c[i]和 ...
- 巅峰极客第二场CTF部分writeup
word-MISC 微信回答问题+word字体里. sqli-WEB 注册个admin空格即可,长字符截断. 晚上把后续的写出来.现在睡觉
随机推荐
- Java第3章笔记
if基本语法: if(条件){// 表达式 // 代码块 } eg: int a = 10; if(a > 1){ System.out.println("内容& ...
- css固宽截取字符串
width:200px; white-space:nowrap; word-break:keep-all; overflow:hidden; text-overflow:ellipsis; 移动端支持 ...
- 36、NSTimer使用详解-开启、关闭、移除
1.要是用一个定时器,首先要定义一个定时器: @property(strong,nonatomic)NSTimer *myTimer;//定时器 2.初始化,初始化有两种方式: 第一种: + (NST ...
- 注意JDBC驱动的版本和JDK的版本是否匹配 JDBC连接Mariadb
Java利用JDBC连接Mariadb的过程和MySQL基本一致. 但是需要注意JDBC驱动的版本和JDK的版本是否匹配: JDBC和JDK版本对应关系 JDBC版本 JDK版本 2.x 1.8 1. ...
- ibatis注意要点
一.ibatis的关键字like查询 select * from t_student where s_name '%张%'; 这种like语句在ibatis中怎么写,他们现在的项目是用ibatis作为 ...
- estimator = KerasClassifier
如何在scikit-learn模型中使用Keras 通过用 KerasClassifier 或 KerasRegressor 类包装Keras模型,可将其用于scikit-learn. 要使用这些包装 ...
- DDR4 PSOD输出的优点--DBI的优点
DDR4是JEDEC组织关于DRAM器件的下一代标准.DDR4主要是针对需要高带宽低功耗的场合.这些需求导致了DDR4芯片引入了一些新的特点,这些新的特点,导致在系统设计中,引入一些新的设计需求. D ...
- silverlight 定时器 System.Windows.Threading.DispatcherTimer
声明 System.Windows.Threading.DispatcherTimer _MessageControler; //刷新 _MessageControler = new System.W ...
- XML xmlns
xmlns xml namespaces 参考 http://www.w3school.com.cn/tags/tag_prop_xmlns.asp http://www.w3school.com.c ...
- $.contains(a,b)
jQuery.contains()函数用于判断指定元素内是否包含另一个元素. 简而言之,该函数用于判断另一个DOM元素是否是指定DOM元素的后代. 该函数属于全局jQuery对象. 语法 jQuery ...