[BZOJ2732][HNOI2012]射箭(二分+半平面交)

【详解】半平面交算法入门详解(计算几何) 半平面交 简介 博客背景 笔者在学习半平面交时,网上找入门博客资源甚少,且大部分难以理解,故在稍稍入门了半平面交后,写此博客,希望能对大家有所帮助。若有错误,麻烦指出。 半平面交是什么? 我们知道一条直线可以把平面分为两部分,其中一半的平面就叫半平面。 那半平面交,就是多个半平面的相交部分。我们在学习线性规划时就有用过。 半平面交有什么用? 1.求解一个区域,可以看到给定图形的各个角落。(多边形的... 阅读详情

=== ===

这里放传送门

=== ===

题解

这题很容易想到按照解析式 y=ax2+bx 和给定的纵坐标范围列出方程然后求半平面交看看有没有交集,也就是会列出一些 yi,1≤ax2i+bxi≤yi,2 这样的东西来,其中 xi 和 yi 都是已知量。因为这个题数据范围比较大所以需要用 O(nlogn) 的半平面交,那么就不能支持在线算法,需要提前知道所有要用的半平面,所以又加入了二分,二分当前能打到哪一关就可以了。

然后就是炸精度,炸精度,炸精度。。。。一开始在直线选点的时候选了和坐标轴的焦点,但这样的话万一遇到过原点的直线就不好办了。然后就是eps不能选的太大,因为当坐标很大的时候做除法会把数字除到1e-9那个级别去。最后加了long double才过掉。。

代码

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const long double eps=1e-16;
const long double inf=1e11;
const long double P=-1.0;
const long double Q=4.0;
int n,N,head,tail;
long double X[200010],Y[200010],Yy[200010];
struct Vector{
    long double x,y;
    Vector(long double X=0,long double Y=0){x=X;y=Y;}
    Vector operator + (const Vector &a){return Vector(x+a.x,y+a.y);}
    Vector operator - (const Vector &a){return Vector(x-a.x,y-a.y);}
    long double operator * (const Vector &a){return x*a.y-y*a.x;}
    Vector mul(long double t){return Vector(x*t,y*t);}
}poly[200010],p[200010];
struct Line{
    Vector P,v;
    long double ang;
    Line(){P=Vector();v=Vector();}
    Line(Vector A,Vector B){
        P=A;v=B-A;ang=atan2(v.y,v.x);
    }
}L[200010],q[200010];
int comp(Line a,Line b){return a.ang<b.ang;}
Vector GLI(Line A,Line B){
    Vector u=A.P-B.P;
    long double t=(B.v*u)/(A.v*B.v);
    return A.P+A.v.mul(t);
}
bool Onleft(Line A,Vector w){return A.v*(w-A.P)>-eps;}
bool HalfpIns(){
    sort(L+1,L+N+1,comp);
    head=tail=1;q[1]=L[1];
    for (int i=2;i<=N;i++){
        while (head<tail&&!Onleft(L[i],p[tail-1])) --tail;
        while (head<tail&&!Onleft(L[i],p[head])) ++head;
        q[++tail]=L[i];
        if (fabs(q[tail].v*q[tail-1].v)<eps){
            --tail;
            if (Onleft(q[tail],L[i].P))
              q[tail]=L[i];
        }
        if (head<tail) p[tail-1]=GLI(q[tail],q[tail-1]);
    }
    while (head<tail&&!Onleft(q[head],p[tail-1])) --tail;
    if (tail-head<=1) return false;
    return true;
}
bool check(int mid){
    Vector A,B,v;N=0;
    long double x,y,yy,M1,M2;
    for (int i=1;i<=mid;i++){
        x=X[i];y=Y[i];yy=Yy[i];
        y-=eps;yy+=eps;
        B=Vector(P,(yy-x*x*P)/x);
        A=Vector(Q,(yy-x*x*Q)/x);
        L[++N]=Line(A,B);
        A=Vector(P,(y-x*x*P)/x);
        B=Vector(Q,(y-x*x*Q)/x);
        L[++N]=Line(A,B);
    }
    L[++N]=Line(Vector(eps,inf),Vector(-inf,inf));
    L[++N]=Line(Vector(-inf,inf),Vector(-inf,eps));
    L[++N]=Line(Vector(-inf,eps),Vector(eps,eps));
    L[++N]=Line(Vector(eps,eps),Vector(eps,inf));
    return HalfpIns();
}
inline int getnum() {
    int ans = 0; char c; bool flag = false;
    while ((c = getchar()) == ' ' || c == '\n' || c == '\r');
    if (c == '-') flag = true; else ans = c - '0';
    while ((c = getchar()) >= '0' && c <= '9') ans = ans * 10 + c - '0';
    return ans * (flag ? -1 : 1);
}
int Divide(int l,int r){
    int mid,ans=0;
    while (l<=r){
        mid=(l+r)>>1;
        if (check(mid)){ans=max(ans,mid);l=mid+1;}
        else r=mid-1;
    }
    return ans;
}
int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++){
        X[i]=getnum();Y[i]=getnum();Yy[i]=getnum();
    }
    printf("%d\n",Divide(1,n));
    return 0;
}

偏偏在最后出现的补充说明

背板子,背板子,背板子T_T

Labview 机器视觉(4)之 图像处理进阶 - 动态ROI与批量保存 本文深入探讨了LabVIEW机器视觉中动态ROI与批量保存两大进阶技术。动态ROI通过模式匹配或粒子分析实现检测区域的自动追踪,解决了产品位置变化带来的挑战。同时,文章详细介绍了如何设计高效的文件命名规则与异步保存机制,以实现海量图像数据的批量保存与管理,从而构建稳定、高效的工业自动化检测系统。 阅读详情

相关推荐

华为[ENSP]OSPF的配置实例(单区域+多区域)

华为[ENSP]OSPF的配置实例(单区域+多区域)

weixin_62594100的博客 2万+

半平面交

什么是半平面:半平面就是指平面的一半,我们知道,一条直线可以将平面分为两个部分,那么这两个部分就叫做两个半平面。 半平面怎么表示呢: 二维坐标系下,直线可以表示为ax + by + c = 0,那么两个半平面则可以表示为ax + by + c >= 0 和ax + by + c < 0,这就是半平面的表示方法。 半平面的交: 其实就是一个方程组,让你画出满足若干个式子的坐标系上的区域(...

qq_2992427261 1267

手把手教你用单结晶体管搭建简易振荡电路(含电路图和波形分析)

本文详细介绍了如何使用单结晶体管(UJT)搭建简易振荡电路,包括电路设计、波形分析和实战技巧。通过具体的电路图和参数计算,帮助电子爱好者和工程师快速掌握UJT振荡器的设计与调试方法,适用于脉冲信号生成和时钟源制作等应用场景。

weixin_29207533的博客 516

半平面交学习笔记

半平面交学习笔记 半平面 半平面:一条直线把一个平面分成的两个平面,如图,直线ABABAB把平面分成左(上)半平面和右(下)半平面的两个平面。 那我们如何判断是在哪一个平面呢?有两种判定方法: 对于直线ABABAB,我们可以通过AAA、BBB的坐标算出其解析式,不妨设为ax+by+c=0ax+by+c=0ax+by+c=0,那么当CCC在左平面时,将CCC的坐标代入直线ABABAB的解析式,...

ez_lcw的博客 627

汽车诊断服务(UDS——0x11服务解析)

ECU复位服务(0x11)详解:该服务支持硬件/钥匙开关/软件三种复位类型(0x01-0x03),复位前需发送肯定响应。请求格式为11+子功能,响应含51+子功能。典型应用需配合安全访问流程,测试时需监控CAN总线通信及DTC状态。复位后ECU将返回默认会话,期间不处理任何诊断请求。服务在编程会话且安全解锁后执行,硬复位会初始化存储数据。

从事汽车行业 979

SQLSTATE58030

在优化一条SQL的时候遇到了执行错误 gtlions =# select t1.telnumber,t2.ua,t2.url,t1.apply_name,t2.apply_name from tb1 t1 gtlions -# left outer join tb2 t2 on t1.sid = t2.ipsid gtlions-# where t1.sum_date=20141128 a

Gtlions Tracker 3660

半平面交详解

更好的阅读体验 定义: 半平面: 顾名思义,就是平面的一半。一条直线会把平面分成两部分,就是两个半平面。对于半平面,我们可以用直线方程式如:\(ax + by >= c\) 表示,更常用的是用直线表示。 半平面交: 顾名思义,就是多个半平面求交集。其结果可能是一个凸多边形、无穷平面、直线、线段、点等。 多边形的核: 如果多边形中存在一个区域使得在区域中可以看到多边形中任意...

baizhang7027的博客 878

CST与MATLAB连接设置

打开MATLAB,点击"Set Path"按钮,然后点击"Add Folder"。在CST中,点击"Options"菜单,然后选择"Advanced"选项。在弹出的对话框中,点击"COMSOL"选项卡,并确保"Enable COMSOL"复选框被选中。通过上述步骤和示例代码,你可以开始使用MATLAB与CST进行集成,并根据你的具体需求进行进一步的开发和应用。通过这个简单的示例,你可以开始在MATLAB中与CST进行交互,并根据你的需求进行更复杂的操作,如参数化仿真、优化和数据处理等。

TechPulseZ的博客 1966

半平面交算法及简单应用

半平面交算法及简单应用 半平面:一条直线把二维平面分成两个平面。 半平面交:在二维几何平面上,给出若干个半平面,求它们的公共部分 半平面交的结果:1.凸多边形(后面会讲解到)2.无界,因为有可能若干半平面没有形成封闭3.直线,线段,点,空(属于特殊情况吧) 算法:1:根据上图可以知道,运用给出的多边形每相邻两点形成一...

weixin_30247307的博客 368

【异常】解决 Claude Code 及第三方插件提示 “API Error: 404“ 的配置修复指南

在使用 Claude 相关的 CLI 工具(如)或 IDE 插件进行开发辅助时,配置错误的模型参数是导致连接失败的常见原因。本文将针对这一典型报错进行复盘与解决。

奶爸的编程之路,也就一周冷个三天 7747

ROS机器人未知环境自主探索功能包explore_lite总结

本系列文章主要针对ROS机器人常使用的未知环境自主探索功能包explore_lite展开全源码的详细解析,并进行概括总结。 本系列文章共包含六篇文章,前五篇文章主要介绍explore_lite功能包中 explore.cpp、costmap_tools.h、frontier_search.cpp、costmap_client.cpp等源码实现文件中全部函数的详细介绍,第六篇文章进行概括总结,包含自主探索功能包explore_lite的简介,实现未知环境自主探索功能的原理及流程总结,效果演示,使用功能包exp

慕羽★的博客 4461

[HNOI2012][BZOJ2732] 射箭 [二分+半平面交]

题面 BZOJ题面 思路 半平面交代码讲解戳这里,用的就是这道题 我们射箭的函数形如$y=Ax^2+Bx$ 考虑每一个靶子$(x_0,y_1,y_2)$,实际上是关于$A,B$的不等式限制条件 我们只要求出有没有$(A,B)$满足所有$2*n$个限制条件就可以了 考虑一个限制条件$y_1\leq Ax_0^2+Bx_0\leq y_2$ 把一个$x_0$除过去,可以得到$B$关于$A$的...

215

AutoSAR配置与实践(深入篇)5.4 OS原理(下 )- 内存保护(MPU)

ECU可能由内部模块、第三方模块等各模块集成的。需求对每个模块所定义的安全等级可能有差异,需要考虑不同安全等级的模块和代码间减少相互干扰,防止程序错误传播。可以理解为包含Task、Alarm、Counter、Schedule table、ISRs、Event等基本对象的容器,用于隔离Task/Alarm等,进行内存保护。

nihaoljq2010的博客 3536

bzoj 2732 [HNOI2012]射箭 二分答案+半平面交

题面 题目传送门 解法 半平面交模板题。 首先可以二分答案,然后考虑如何检验答案是否合法。 现在对于每一个靶子都有一个形如l≤ax2+bx≤rl\leq ax^2+bx\leq rl≤ax2+bx≤r的限制,x,l,rx,l,rx,l,r为常量,那么就可以看成对a,ba,ba,b的限制,转化成半平面交。 其实不需要每一次二分的时候都进行一次排序,可以先排序,然后将编号在二分范围内的半平面取出即可...

mysterynoip的博客 240

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【BZOJ2732】[HNOI2012]射箭 二分+半平面交

【BZOJ2732】[HNOI2012]射箭 Description 沫沫最近在玩一个二维的射箭游戏,如下图 1 所示,这个游戏中的 x 轴在地面,第一象限中有一些竖直线段作为靶子,任意两个靶子都没有公共部分,也不会接触坐标轴。沫沫控制一个位于(0,0)的弓箭手,可以朝 0 至 90?中的任意角度(不包括 0度和 90度),以任意大小的力量射出带有穿透能力的光之箭。由于游戏中没有...

aodanchui1057的博客 127

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

bzoj2732: [HNOI2012]射箭 半平面交+二分答案

bzoj2732: [HNOI2012] Description 沫沫最近在玩一个二维的射箭游戏,如下图 1 所示,这个游戏中的 x 轴在地面,第一象限中有一些竖直线段作为靶子,任意两个靶子都没有公共部分,也不会接触坐标轴。沫沫控制一个位于(0,0)的弓箭手,可以朝 0 至 90?中的任意角度(不包括 0度和 90度),以任意大小的力量射出带有穿透能力的光之箭。由于游戏中没有空气阻力,并且光之

maxtir的博客 268

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【BZOJ2732】【HNOI2012】射箭 二分+半平面交

此题重点在卡精度!!! 本地已经下载数据测试并通过了,然而$B$站上还是$WA$的,可能是$CPU$对于$long\ double$ 的资瓷不一样。 此题答案显然是可以二分出来的,设当前要监测是否能射穿前$mid$个靶子。 我们发现要穿过第i个靶子,那么$a,b$必须满足$l_i≤ax_i^2+bx_i≤r_i$。 我们简单地转化下式子,我们就可以得到$\dfrac{l_i...

diaoyoutun2652的博客 119

[BZOJ2732][HNOI2012]射箭(二分答案+半平面交)

Description 沫沫最近在玩一个二维的射箭游戏,如下图 111 所示,这个游戏中的 xxx 轴在地面,第一象限中有一些竖直线段作为靶子,任意两个靶子都没有公共部分,也不会接触坐标轴。沫沫控制一个位于 (0,0)(0,0)(0,0) 的弓箭手,可以朝 000 至 909090 中的任意角度(不包括 000 度和 909090 度),以任意大小的力量射出带有穿透能力的光之箭。由于游戏中没有空...

女装的你,如此好看! 271

bzoj 2732: [HNOI2012]射箭 (二分+半平面交)

2732: [HNOI2012]射箭 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 2537  Solved: 853 [Submit][Status][Discuss] Description 沫沫最近在玩一个二维的射箭游戏,如下图 1 所示,这个游戏中的 x 轴在地面,第一象限中有一些竖直线段作为靶子,任意两个靶子都没有公共部分

clover_hxy的博客 448

bzoj2732: [HNOI2012]射箭【二分答案+半平面交】

Description 沫沫最近在玩一个二维的射箭游戏,如下图 1 所示,这个游戏中的 x 轴在地面,第一象限中有一些竖直线段作为靶子,任意两个靶子都没有公共部分,也不会接触坐标轴。沫沫控制一个位于(0,0)的弓箭手,可以朝 0 至 90?中的任意角度(不包括 0度和 90度),以任意大小的力量射出带有穿透能力的光之箭。由于游戏中没有空气阻力,并且光之箭没有箭身,箭的轨迹会是一条标准的抛物线,被...

cdsszjj的博客 331

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

题目描述 给出二维平面上n个与y轴平行的线段,求最大的k,使得存在一条形如$y=ax^2+bx(a<0,b>0)$的抛物线与前k条线段均有公共点 输入 输入文件第一行是一个正整数N,表示一共有N关。接下来有N行,第i+1行是用空格隔开的三个正整数xi,yi1,yi2(yi1<yi2),表示第i关出现的靶子的横坐标是xi,纵坐标的范围是从yi1到yi2。输入保...

weixin_30512043的博客 120

bzoj 2732 [HNOI2012]射箭 半平面交(刘汝佳版不超时) + 整型二分处理

题目来源: http://61.187.179.132/JudgeOnline/problem.php?id=2732 题意:   对于一个靶子, 得到两个不等式。 裸地半平面交 。  分析: 用的 一般的 模板,总是TLE 。 改成了 刘汝佳 版本 ,依然超时, 所谓的常数太大????  后来注意到 : 当    判断两个向量平行且 同向 ,取左边的一个,不要用 叉积,用极角判断,

zn505119020的专栏 607
上一篇: [BZOJ1038][ZJOI2008]瞭望塔(半平面交)
下一篇: [BZOJ3930][CQOI2015]选数(莫比乌斯反演+杜教筛)
FromATP
博客等级 码龄10年 75粉丝 163原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值