题目传送: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(计算几何+二分)的更多相关文章

  1. 牛客第二场Dmoney

    链接:https://www.nowcoder.com/acm/contest/140/D 来源:牛客网 题目描述 White Cloud has built n stores numbered to ...

  2. 牛客第二场A-run

    链接:https://www.nowcoder.com/acm/contest/140/A 来源:牛客网 White Cloud is exercising in the playground. Wh ...

  3. 牛客第二场 J farm

    White Rabbit has a rectangular farmland of n*m. In each of the grid there is a kind of plant. The pl ...

  4. 牛客第二场-J-farm-二维树状数组

    二维树状数组真的还挺神奇的,更新也很神奇,比如我要更新一个区域内的和,我们的更新操作是这样的 add(x1,y1,z); add(x2+1,y2+1,z); add(x1,y2+1,-z); add( ...

  5. 第k小团(Bitset+bfs)牛客第二场 -- Kth Minimum Clique

    题意: 给你n个点的权值和连边的信息,问你第k小团的值是多少. 思路: 用bitset存信息,暴力跑一下就行了,因为满足树形结构,所以bfs+优先队列就ok了,其中记录下最后进入的点(以免重复跑). ...

  6. 走环概率问题(至今有点迷)--牛客第二场( Eddy Walker)

    思路: 概率结论题,好像属于线性递推,现在也不太懂(lll¬ω¬) #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include < ...

  7. 2020牛客暑期多校训练营 第二场 B Boundary 计算几何 圆 已知三点求圆心

    LINK:Boundary 计算几何确实是弱项 因为好多东西都不太会求 没有到很精通的地步. 做法很多,先说官方题解 其实就是枚举一个点 P 然后可以发现 再枚举一个点 然后再判断有多少个点在圆上显然 ...

  8. 牛客网暑期ACM多校训练营(第二场)message

    传送门:https://ac.nowcoder.com/acm/problem/16631 题意 对于直线y=ax+b,给出n个的a[i]和b[i].m次询问,每次询问给出直线y=cx+d的c[i]和 ...

  9. 巅峰极客第二场CTF部分writeup

    word-MISC 微信回答问题+word字体里. sqli-WEB 注册个admin空格即可,长字符截断. 晚上把后续的写出来.现在睡觉

随机推荐

  1. 使用SpringMVC的@CrossOrigin注解解决跨域请求问题

    跨域问题,通俗说就是用ajax请求其他站点的接口,浏览器默认是不允许的.同源策略(Same-orgin policy)限制了一个源(orgin)中加载脚本或脚本与来自其他源(orgin)中资源的交互方 ...

  2. kbmmw 中JSON 中使用SQL 查询

    前面讲到了kbmmw 的JSON 对象操作,如何快速的查找JSON 中的值? 一种办法就是通过遍历的方法,其实在kbmmw 还有一种灵活的查询方式, 就是通过SQL 方式查询JSON 中的值.也就是说 ...

  3. 开发简单的JavaWeb项目

    一.配置相关环境 下载配置JDK,eclipse,Tomcat服务器,Mysql数据库,Navicat for MySQL(数据库可视化工具) 如果你已经做好各个环境的配置,eclipse与Tomca ...

  4. 关于oracle的锁表解决session marked for kill

    oracle 使用的过程中,有时候会遇到锁表的情况,数据库增.删.改.查都是会锁表的,但是锁的类型会不同, 大多是行锁,部分会是表锁. 在oracle运行中,一直是有表在锁的,只不过很快一个操作结束, ...

  5. 通俗理解 CPU && GPU

    CPU 力气大啥P事都能干,还要协调.GPU 上面那家伙的小弟,老大让他处理图形,这方面处理简单,但是量大,老大虽然能处理,可是老大只有那么几个兄弟,所以不如交给小弟处理了,小弟兄弟多,有数百至数千个 ...

  6. SQL MAP 注入测试

    SQL MAP是一款测试系统是否有SQL漏洞的工具 下载地址: http://sqlmap.org/ sqlmap 是一款使用python编写的工具,所以需要安装python,需要安装python 为 ...

  7. kubeadm 双节点部署k8s v1.13.3+calico v3.3.4

    一.部署环境 VMware Workstation 10 centos7 二.主机配置(每台主机都要做) 主机名 ip cpu ram master 192.168.137.10 3G node1 1 ...

  8. 第32章:MongoDB-索引--Capped固定集合

    ①Capped集合(固定集合) Capped集合的大小固定,性能好,如果空间用完了,新的对象会覆盖旧的对象. find时默认就是插入的顺序,Capped集合会自动维护. ②语法 db.createCo ...

  9. 第14章:MongoDB-聚合操作--聚合管道

    ① 聚合管道是MongoDB2.2版本引入的新功能.它由阶段(Stage)组成,文档在一个阶段处理完毕后,聚合管道会把处理结果传到下一个阶段. 每个阶段用阶段操作符(Stage Operators)定 ...

  10. ACtiveMQ中间件-发布订阅模式

    前言:ActiveMQ学习心得 1.MQ是什么 MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信, ...