【BZOJ2732】【HNOI2012】射箭 二分+半平面交
此题重点在卡精度!!!
本地已经下载数据测试并通过了,然而$B$站上还是$WA$的,可能是$CPU$对于$long\ double$ 的资瓷不一样。
此题答案显然是可以二分出来的,设当前要监测是否能射穿前$mid$个靶子。
我们发现要穿过第i个靶子,那么$a,b$必须满足$l_i≤ax_i^2+bx_i≤r_i$。
我们简单地转化下式子,我们就可以得到$\dfrac{l_i}{x_i^2}+\dfrac{b}{x_i}≤a≤\dfrac{r_i}{x_i^2}+\dfrac{b}{x_i}$。
我们想象一个以$b$为横坐标,$a$为纵坐标的平面直角坐标系中,这一对约束可以通过两个半平面的交来表示。
不难发现满足射穿前$mid$个靶子的数对$(a,b)$,必然在这$2mid$个半平面的交内。
于是问题就转化为这2$mid$个半平面是否有交(半平面交判定)
时间复杂度:$O(n\ \log\ n)$。
#include<bits/stdc++.h>
#define M 210005
#define D long double
#define eps 1e-20
#define INF 1e15
using namespace std; int dx[M]={},dl[M]={},dr[M]={},m=; struct pt{
D x,y; pt(D X=,D Y=){x=X; y=Y;}
friend pt operator +(pt a,pt b){return pt(a.x+b.x,a.y+b.y);}
friend pt operator -(pt a,pt b){return pt(a.x-b.x,a.y-b.y);}
friend D operator *(pt a,pt b){return a.x*b.y-a.y*b.x;}
void out(){printf("(%.1Lf,%.1Lf)",x,y);}
};
struct line{
pt a,b; D ang; int id;
line(){a=pt(,); b=pt(,);}
line(pt A,pt B,int ID){ id=ID; a=A; b=B;
ang=atan2(b.y-a.y,b.x-a.x);} D getk(){return (b.y-a.y)/(b.x-a.x);}
D getb(){return a.y-a.x*getk();}
friend bool operator <(line a,line b){return a.ang<b.ang;}
friend pt operator *(line a,line b){
D k1=(b.b-a.a)*(a.b-a.a);
D k2=(a.b-a.a)*(b.a-a.a);
D t=k2/(k1+k2);
return pt(b.a.x+t*(b.b.x-b.a.x),b.a.y+t*(b.b.y-b.a.y));
}
}p[M],q[M];
bool inleft(line a,line b,line c){
pt d=a*b;
return (d-c.a)*(c.b-c.a)<=eps;
}
bool solve(int n){
int l=,r=;
for(int i=;i<=m;i++){
if(p[i].id>n) continue;
while(l<r&&(!inleft(q[r-],q[r],p[i]))) r--;
while(l<r&&(!inleft(q[l+],q[l],p[i]))) l++;
q[++r]=p[i];
}
while(l<r&&(!inleft(q[r-],q[r],q[l]))) r--;
while(l<r&&(!inleft(q[l+],q[l],q[r]))) l++;
return r-l>=;
}
int main(){
int n;scanf("%d",&n); if(n<=){printf("%d\n",n); return ;}
for(int i=;i<=n;i++) scanf("%d%d%d",dx+i,dl+i,dr+i);
int l=,r=n;
for(int i=;i<=n;i++){
D L=dl[i],R=dr[i],X=dx[i];
p[++m]=line(pt(,L/(X*X)),pt(,L/(X*X)-/X),i);
p[++m]=line(pt(,R/(X*X)-/X),pt(,R/(X*X)),i);
}
pt a1=pt(INF,INF),a2=pt(-INF,INF),a3=pt(-INF,-INF),a4=pt(INF,-INF);
p[++m]=line(a1,a2,); p[++m]=line(a2,a3,); p[++m]=line(a3,a4,); p[++m]=line(a4,a1,);
sort(p+,p+m+);
while(l<r){
int mid=(l+r+)>>;
if(solve(mid)) l=mid;
else r=mid-;
}
cout<<l<<endl;
}
【BZOJ2732】【HNOI2012】射箭 二分+半平面交的更多相关文章
- 【bzoj2732】[HNOI2012]射箭  二分+半平面交
		
题目描述 给出二维平面上n个与y轴平行的线段,求最大的k,使得存在一条形如$y=ax^2+bx(a<0,b>0)$的抛物线与前k条线段均有公共点 输入 输入文件第一行是一个正整数N,表示一 ...
 - POJ 3525 Most Distant Point from the Sea 二分+半平面交
		
题目就是求多变形内部一点. 使得到任意边距离中的最小值最大. 那么我们想一下,可以发现其实求是看一个圆是否能放进这个多边形中. 那么我们就二分这个半径r,然后将多边形的每条边都往内退r距离. 求半平面 ...
 - 洛谷P3222 [HNOI2012]射箭(计算几何,半平面交,双端队列)
		
洛谷题目传送门 设抛物线方程为\(y=ax^2+bx(a<0,b>0)\),我们想要求出一组\(a,b\)使得它尽可能满足更多的要求.这个显然可以二分答案. 如何check当前的\(mid ...
 - [bzoj2732][HNOI2012]射箭
		
Description 沫沫最近在玩一个二维的射箭游戏,如下图所示,这个游戏中的$x$轴在地面,第一象限中有一些竖直线段作为靶子,任意两个靶子都没有公共部分,也不会接触坐标轴.沫沫控制一个位于$(0, ...
 - POJ3525   半平面交
		
题意:求某凸多边形内部离边界最远的点到边界的距离 首先介绍半平面.半平面交的概念: 半平面:对于一条有向直线,它的方向的左手侧就是它所划定的半平面范围.如图所示: 半平面交:多个半平面的交集.有点类似 ...
 - 【kuangbin专题】计算几何_半平面交
		
1.poj3335 Rotating Scoreboard 传送:http://poj.org/problem?id=3335 题意:就是有个球场,球场的形状是个凸多边形,然后观众是坐在多边形的边上的 ...
 - 【BZOJ-4515】游戏          李超线段树 + 树链剖分 + 半平面交
		
4515: [Sdoi2016]游戏 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 304 Solved: 129[Submit][Status][ ...
 - poj3335   半平面交
		
题意:给出一多边形.判断多边形是否存在一点,使得多边形边界上的所有点都能看见该点. sol:在纸上随手画画就可以找出规律:按逆时针顺序连接所有点.然后找出这些line的半平面交. 题中给出的点已经按顺 ...
 - POJ 3130 How I Mathematician Wonder What You Are! /POJ 3335 Rotating Scoreboard 初涉半平面交
		
题意:逆时针给出N个点,求这个多边形是否有核. 思路:半平面交求多边形是否有核.模板题. 定义: 多边形核:多边形的核可以只是一个点,一条直线,但大多数情况下是一个区域(如果是一个区域则必为 ).核内 ...
 
随机推荐
- Winfrom 嵌入word、excel实现源码
			
效果图: winform中嵌入word的方法有多种:调用API,使用webBroser或使用DSOFRAMER控件: API过于繁琐: webbroser读取小文件还行,大文件就太痛苦了: 所以还是选 ...
 - HBase Thrift2 CPU过高问题分析
			
目录 目录 1 1. 现象描述 1 2. 问题定位 2 3. 解决方案 5 4. 相关代码 5 1. 现象描述 外界连接9090端口均超时,但telnet端口总是成功.使用top命令观察,发现单个线程 ...
 - 从LSM-Tree、COLA-Tree谈到StackOverflow、OSQA
			
转自: http://blog.csdn.net/v_july_v/article/details/7526689 从LSM-Tree.COLA-Tree谈到StackOverflow.OSQA 作者 ...
 - Hdu1896 Stones(优先队列)                                                                                            2017-01-17 13:07             40人阅读              评论(0)              收藏
			
Stones Time Limit : 5000/3000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total Submis ...
 - OpenGL中的矩阵相乘
			
OpenGL中的矩阵相乘 1, 在OpenGL中所有的视图变换,模型变换 都是4×4矩阵,每个后续的glMultiMatrix*(N),或者变换函数,glTranslate* (),glRotate* ...
 - Java菜鸟学习笔记(23)--继承篇(二):继承与组合
			
组合是什么 1.继承和组合都是一种随思想渗透而下的编码方式,其根本目的都是为了复用类,减少重复代码 2.要实现一个类的复用,可以分为组合语法和继承语法 3.组合就是通过将一个对象置于一个新类中,将其作 ...
 - Java中对比两个对象中属性值[反射、注解]
			
在Java中通常要比较两个对象在修改前与修改后的值是否相同,一般我们采用的是反射技术获取对象的get方法[或其他的方法]获取值并做比较.如果系统将修改的属性名称也显示出来,这样就能更直观的显示类中的哪 ...
 - AgentJob--无法重启Job--22022错误
			
错误描述: 发现有个Job计划为长期重复运行,但从某个时间点后未运行,无任何错误信息. 手动启动该Job后爆以下错误 运行环境: Window Server 2008 R2 Enterprise Mi ...
 - ASP.NET Core真实管道详解[1]
			
ASP.NET Core管道虽然在结构组成上显得非常简单,但是在具体实现上却涉及到太多的对象,所以我们在 <ASP.NET Core管道深度剖析[共4篇]> 中围绕着一个经过极度简化的模拟 ...
 - asp.net 网站监控方案
			
前言:监控web网站方法有很多种,这篇文章说一下对windows服务器 asp.net网站的监控 采用的方案,Powershell + Influxdb + Grafana 1.PowerShell ...