【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个点,求这个多边形是否有核. 思路:半平面交求多边形是否有核.模板题. 定义: 多边形核:多边形的核可以只是一个点,一条直线,但大多数情况下是一个区域(如果是一个区域则必为 ).核内 ...
随机推荐
- 2018.08.30 NOIP模拟 wall(模拟)
[问题描述] 万里长城是中国强大的标志,长城在古代的用途主要用于快速传递军事消息和抵御 外敌,在长城上的烽火台即可以作为藏兵的堡垒有可以来点燃狼烟传递消息. 现在有一段 万里长城,一共有 N 个烽火台 ...
- hdu-2191(完全背包+二进制优化模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191 思路:完全背包模板 #include<iostream> #include<c ...
- IntelliJ IDEA 2017版 spring-boot使用Spring Data JPA使用Repository<T, T>编程
1.环境搭建pom.xml搭建 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=& ...
- HDU 2106 decimal system (进制转化求和)
题意:给你n个r进制数,让你求和. 析:思路就是先转化成十进制,再加和. 代码如下: #include <iostream> #include <cstdio> #includ ...
- RESTful架构概念
本文转载自:http://www.ruanyifeng.com/blog/2011/09/restful.html 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软 ...
- 用Git将项目发布在GitHub里
转载自http://blog.csdn.net/u011572517/article/details/50537407,个人加了一些注意事项和解释. githud是一个程序员以后成长都会使用到的,先不 ...
- Shell编程-05-Shell中条件测试与比较
目录 Shell脚本条件测试 Shell文件测试 Shell字符测试 Shell整数测试 Shell逻辑测试 Shell条件测试总结 Shell脚本条件测试 在Shell脚本中各种条件结构和流 ...
- 20155339 2016-2017-2 《Java程序设计》第9周学习总结
20155339 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 JDBC入门 JDBC简介 JDBC全名Java DataBase Connectivity ...
- hdu 4950 打怪
http://acm.hdu.edu.cn/showproblem.php?pid=4950 给定怪兽血量h,你攻击力a,怪物回血力b,你攻击k次要休息一次,问能否杀死怪兽 特判一次打死怪兽的情况和第 ...
- mySQl数据库中不能插入中文的处理办法
1. 修改MySQL安装目录下(C:\Program Files\MySQL\MySQL Server 5.5)的my.ini文件 设置: default-character-set=utf8 cha ...