• 设抛物线方程\(y = ax^2 + bx\), 那么对于一个靶子\((x_i,y_{down},y_{up})\)我们需要满足的条件就是
  • \(\frac{y_{down}}{x_i} \leq ax_i + b \leq \frac{y_{up}}{x_i}\), 实际上可以看做二维平面上的一个半平面,
  • 然后我们二分能打到的最远距离, 我们只需要求出这些半平面是否有交就好了
  • 当然我们要把ab的合法范围勾选出来, 满足, a < 0, b > 0
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
#include<iostream>
#define ll long long
#define double long double
#define M 600010
#define mmp make_pair
const double inf = pow(2, 60), eps = 1e-12;
using namespace std;
int read() {
int nm = 0, f = 1;
char c = getchar();
for(; !isdigit(c); c = getchar()) if(c == '-') f = -1;
for(; isdigit(c); c = getchar()) nm = nm * 10 + c - '0';
return nm * f;
}
struct Vec {
double x, y;
Vec () {}
Vec(double a, double b) {
x = a, y = b;
}
Vec operator + (Vec b) {
return Vec(x + b.x, y + b.y);
}
Vec operator - (Vec b) {
return Vec(x - b.x, y - b.y);
}
Vec operator *(double a) {
return Vec(x * a, y * a);
}
double operator ^ (Vec a) {
return x * a.y - y * a.x;
}
} k[M]; struct Line {
Vec p, v;
double k;
int id;
Line() {}
Line(Vec a, Vec b, int c) {
p = a, v = b - a, k = atan2(v.y, v.x), id = c;
}
bool operator < (const Line &b) const
{
return this->k < b.k;
}
bool right(Vec a) {
return (v ^ (a - p)) < -eps;
}
friend Vec cross(Line a, Line b) {
return a.p + a.v * ((b.v ^ (b.p - a.p)) / (b.v ^ a.v));
}
} a[M], q[M];
int tp = 0, n; bool check(int mid) {
int h = 0, t = 0, i = 1;
while(a[i].id > mid) i++;
for(q[0] = a[i++]; i <= tp; i++)
{
if(a[i].id > mid) continue;
while(h < t && a[i].right(k[t - 1])) --t;
while(h < t && a[i].right(k[h]))h++;
if(a[i].k != q[t].k) q[++t] = a[i];
else if(a[i].right(q[t].p)) q[t] = a[i];
if(h < t) k[t - 1] = cross(q[t - 1], q[t]);
}
while(h < t && q[h].right(k[t - 1])) --t;
return t - h > 1;
} int main() {
n = read();
for(int i = 1; i <= n; i++) {
double x = read(), yd = read(), yp = read();
a[++tp] = Line(Vec(0, yd / x), Vec(1, yd / x - x), i);
a[++tp] = Line(Vec(1, yp / x - x), Vec(0, yp / x), i);
}
a[++tp] = Line(Vec(-inf, eps), Vec(-eps, eps), 0);
a[++tp] = Line(Vec(-eps, eps), Vec(-eps, inf), 0);
a[++tp] = Line(Vec(-eps, inf), Vec(-inf, inf), 0);
a[++tp] = Line(Vec(-inf, inf), Vec(-inf, eps), 0);
sort(a + 1, a + tp + 1);
int l = 1, r = n;
while(l + 1 < r) {
int mid = (l + r) >> 1;
if(check(mid)) l = mid;
else r = mid;
}
printf("%d\n", check(r) ? r : l);
return 0;
}

[HNOI2012]射箭(计算几何)的更多相关文章

  1. BZOJ 2732: [HNOI2012]射箭

    2732: [HNOI2012]射箭 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2532  Solved: 849[Submit][Status] ...

  2. 洛谷P3222 [HNOI2012]射箭(计算几何,半平面交,双端队列)

    洛谷题目传送门 设抛物线方程为\(y=ax^2+bx(a<0,b>0)\),我们想要求出一组\(a,b\)使得它尽可能满足更多的要求.这个显然可以二分答案. 如何check当前的\(mid ...

  3. [bzoj2732][HNOI2012]射箭

    Description 沫沫最近在玩一个二维的射箭游戏,如下图所示,这个游戏中的$x$轴在地面,第一象限中有一些竖直线段作为靶子,任意两个靶子都没有公共部分,也不会接触坐标轴.沫沫控制一个位于$(0, ...

  4. [HNOI2012]射箭

    Description 沫沫最近在玩一个二维的射箭游戏,如下图 1 所示,这个游戏中的 x 轴在地面,第一象限中有一些竖直线段作为靶子,任意两个靶子都没有公共部分,也不会接触坐标轴.沫沫控制一个位于( ...

  5. BZOJ2732:[HNOI2012]射箭——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=2732 https://www.luogu.org/problemnew/show/P3222#su ...

  6. bzoj2732: [HNOI2012]射箭 半平面交

    这题乍一看与半平面交并没有什么卵联系,然而每个靶子都可以转化为两个半平面. scanf("%lf%lf%lf",&x,&ymin,&ymax); 于是乎就有 ...

  7. 2732: [HNOI2012]射箭( 半平面交 )

    很久没写题解了= =,来水一发吧= = 首先这道题很明显就是求y=ax^2+bx的是否有值取,每一个式子都代表着两个半平面,然后直接半平面交就行了 借鉴了hzwer的代码,还是特别简洁的说 CODE: ...

  8. Luogu-3222 [HNOI2012]射箭

    几何题,二次函数,化一下式子吧 设二次函数\(y=ax^2+bx\),对于一个线段\((x,y1)\),\((x,y2)\),与他相交的条件是\(y1<=ax^2+bx<=y2\) 对于\ ...

  9. 【bzoj2732】[HNOI2012]射箭 二分+半平面交

    题目描述 给出二维平面上n个与y轴平行的线段,求最大的k,使得存在一条形如$y=ax^2+bx(a<0,b>0)$的抛物线与前k条线段均有公共点 输入 输入文件第一行是一个正整数N,表示一 ...

随机推荐

  1. Flutter(一)安装配置和几个注意点

    Flutter(一)安装配置和几个注意点 记住要仰望星空,不要低头看脚下.无论生活如何艰难,请保持一颗好奇心.你总会找到自己的路和属于你的成功. 愿您的来世灵魂依旧,躯体康健. 一句话来形容Flutt ...

  2. 指导手册03:Hadoop基础操作

    指导手册03:Hadoop基础操作 Part 1:查看Hadoop集群的基本信息1.查询存储系统信息(1)在WEB浏览器的地址栏输入http://master:50070/ 请查看自己的Hadoop集 ...

  3. java基础知识点学习

    基础学习总结 1.锁sync/lock都有哪些方法,底层实现 synchronized ['sɪŋkrənaɪzd] 2.线程池的参数.线程池执行的流程,当到达线程池到达最大数,队列也满了,出现的异常 ...

  4. Android开发 ---代码创建选项菜单、隐藏菜单项、菜单的生命周期,菜单按钮图标设置、搜索框、xml中设置子菜单

    1.activity_main.xml 描述: 定义了一个按钮 <?xml version="1.0" encoding="utf-8"?> < ...

  5. spring boot 常见的配置问题

    最近在自学spring boot ,新手教程网上很多,这里主要记录下配置过程中的一些疑难杂症.这些记录都是针对以下配置生成的项目 1.该项目一定要用jdk1.8 2.application.prope ...

  6. DoTween的用法

    using UnityEngine;using System.Collections;using DG.Tweening;using UnityEngine.UI; public class Test ...

  7. 过滤函数 filter

    filter(lambda x:x.endswith('居'),house_type_list) 过滤函数,作用就是将“以‘居’结尾的字段都过滤出来,其它的字段都删除掉.”

  8. Fescar Example-Spring Cloud

    项目说明 本项目演示如何使用 Fescar Starter 完成 Spring Cloud 应用的分布式事务接入. 准备工作 在运行此示例之前,你需要先完成如下几步准备工作: 配置数据库 创建 UND ...

  9. Postman插件使用

    Postman插件:模拟前端请求后台,用于后台对外接口测试 POSTMAN解决..先解压Postman_v4.1.3.rar 然后按自己实际解压的文件夹里面的这个文件夹_metadata前面的_去掉 ...

  10. api管理平台

    安装和介绍 安装要求:(centos安装环境) nodejs(7.6+) mongodb(2.6|+) 安装get和编译的工具 yum -y install wget make gcc gcc-c++ ...