Description

沫沫最近在玩一个二维的射箭游戏,如下图 1 所示,这个游戏中的 x 轴在地面,第一象限中有一些竖直线段作为靶子,任意两个靶子都没有公共部分,也不会接触坐标轴。沫沫控制一个位于(0,0)的弓箭手,可以朝 0 至 90?中的任意角度(不包括 0度和 90度),以任意大小的力量射出带有穿透能力的光之箭。由于游戏中没有空气阻力,并且光之箭没有箭身,箭的轨迹会是一条标准的抛物线,被轨迹穿过的所有靶子都认为被沫沫射中了,包括那些 只有端点被射中的靶子。这个游戏有多种模式,其中沫沫最喜欢的是闯关模式。在闯关模式中,第一关只有一个靶 子,射中这个靶子即可进入第二关,这时在第一关的基础上会出现另外一个靶子,若能够一箭 双雕射中这两个靶子便可进入第三关,这时会出现第三个靶子。依此类推,每过一关都会新出 现一个靶子,在第 K 关必须一箭射中前 K 关出现的所有 K 个靶子才能进入第 K+1 关,否则游戏 结束。沫沫花了很多时间在这个游戏上,却最多只能玩到第七关“七星连珠”,这让她非常困惑。 于是她设法获得了每一关出现的靶子的位置,想让你告诉她,最多能通过多少关

Input

输入文件第一行是一个正整数N,表示一共有N关。接下来有N行,第i+1行是用空格隔开的三个正整数xi,yi1,yi2(yi1 < yi2 ),表示第i关出现的靶子的横坐标是xi,纵坐标的范围是从yi1到yi2 。
输入保证30%的数据满足N≤100,50%的数据满足N≤5000,100%的数据满足N≤100000且给 出的所有坐标不超过109 。

Output

仅包含一个整数,表示最多的通关数。

Sample Input

5
2 8 12
5 4 5
3 8 10
6 2 3
1 3 7

思路

设这个经过原点的抛物线为y = a * x ^ 2 + b * x,设一条线段的起点和终点为(x0,y1)和(x0,y2),且y2 > y1。
将x0带入到设出的抛物线中,会得到y = a * x0 ^ 2 + b * x0,这时候需要满足的是y <= y2 && y >= y1,也就是a * x0 ^ 2 + b * x0 <= y2 && y1 <= a * x0 ^ 2 + b * x0
整理一下思路,x0,y1,y2是已知量,a和b是我们设出来的量,不妨换一种写法,令x = a,y = b,k = x0,那么原不等式组就是
=> x * k ^ 2 + y * k <= y2 && x * k ^ 2 + y * k >= y1
=> x * k ^ 2 + y * k - y2 <= 0 && x * k ^2 + y * k - y1 >= 0
这样就很明显了,不等式组化成了两个半平面,之后利用半平面交判定是否存在就可以了。最外层套一个二分,时间复杂度大概是O(nlog^2n)

代码

看起来不简单

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#define DCMP(a) (fabs(a)<EPS)
using namespace std;
const int N=200000+5;
const int EPS=1e-15;
struct Point
{  long double x,y;         Point(long double _ = .0,long double __ = .0):x(_),y(__) {}  Point operator +(const Point &a)const {return Point(x+a.x,y+a.y);}  Point operator -(const Point &a)const {return Point(x-a.x,y-a.y);}  Point operator *(double a)const {return Point(x*a,y*a);}
}p[N];
struct Line
{Point p,v;long double alpha;Line(Point _,Point __):p(_),v(__) {alpha=atan2(v.y,v.x);}Line(){}  bool operator <(const Line &a)const {return alpha<a.alpha;}
}src[N],line[N],q[N];
int t,lines;
inline long double Cross(Point p1,Point p2)
{  return p1.x*p2.y-p1.y*p2.x;
}
inline bool OnLeft(Point p,Line l)
{  return Cross(l.v,p-l.p)>=0;//left or right
}
inline Point GetIntersection(Line l1,Line l2)
{  Point u=l1.p-l2.p;  long double temp=Cross(l2.v,u)/Cross(l1.v,l2.v);  return l1.p+l1.v*temp;
}
inline bool HalfplaneIntersection(int lines)
{  int front=1,tail=1;  q[1]=line[1];  for (int i=2;i<=lines;++i) {  while(front<tail&&!OnLeft(p[tail-1],line[i])) --tail;  while(front<tail&&!OnLeft(p[front],line[i])) ++front;  if (DCMP(Cross(q[tail].v,line[i].v)))  q[tail]=OnLeft(q[tail].p,line[i])?q[tail]:line[i];  else q[++tail]=line[i];  if (front<tail) p[tail-1]=GetIntersection(q[tail],q[tail-1]);  }  while(front<tail&&!OnLeft(p[tail-1],q[front])) --tail;  return tail-front>1;
}
inline bool Judge(int mid)
{mid<<=1;  memcpy(line+1,src+1,sizeof(Line)*mid);  sort(line+1,line+mid+1);  return HalfplaneIntersection(mid);
}
int main()
{scanf("%d",&t);for (int i=1;i<=t;++i){static double x,y1,y2;scanf("%lf%lf%lf",&x,&y1,&y2);src[++lines]=Line(Point(0,y2/x),Point(-1/x,1));  src[++lines]=Line(Point(0,y1/x),Point(1/x,-1));  }int l=1,r=t,ans=1;while(l<=r){int mid=(l + r)>>1;  if (Judge(mid)) ans=mid,l=mid+1;  else r=mid-1;  }printf("%d\n",ans);return 0;
}

bzoj 2732 射箭 半平面交 解题报告相关推荐

  1. BZOJ 4710 [Jsoi2011]分特产 解题报告

    4710 [Jsoi2011]分特产 题意 给定\(n\)个集合,每个集合有相同的\(a_i\)个元素,不同的集合的元素不同.将所有的元素分给\(m\)个不同位置,要求每个位置至少有一个元素,求分配方 ...

  2. (全网最详细!)bzoj 2548 灭鼠行动 模拟 解题报告

    Description 最近,有一些繁殖力很强的老鼠在下水道非常猖獗,灭鼠特工队正在计划消灭这些老鼠.下水道只有东西方向和南北方向的管道,如图所示. 灭鼠特工队的队员拥有强大的武器.他们将在某些时刻t ...

  3. [jzoj 6093] [GDOI2019模拟2019.3.30] 星辰大海 解题报告 (半平面交)

    题目链接: https://jzoj.net/senior/#contest/show/2686/2 题目: 题解: 说实话这题调试差不多花了我十小时,不过总算借着这道题大概了解了计算几何的基础知识 ...

  4. [BZOJ 1038][ZJOI 2008]瞭望塔(半平面交)

    题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=1038 思路 这个题在上海ACM/ICPC冬令营的比赛中也考过,不是很难,不过想要想到用半平 ...

  5. 解题报告(十八)数论题目泛做(Codeforces 难度:2000 ~ 3000 + )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  6. 【解题报告系列】超高质量题单 + 题解(ACM / OI)超高质量题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我新写的超高质量的题解和代码,题目难度不 ...

  7. 解题报告(三)多项式求值与插值(拉格朗日插值)(ACM / OI)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  8. 解题报告(十三)中国剩余定理(ACM / OI)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  9. 解题报告(四)生成函数(ACM/ OI)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

最新文章

  1. nginx连接php-fpm sock文件失败502
  2. js splice方法_我用JS刷LeetCode | Day 8
  3. 相关和因果是一回事吗?R值低就是不相关?终于有人讲明白了
  4. 安卓开发笔记(二十二):读取本地(内置)html文件并实现和Javascript交互
  5. 【Spring中使用MongoTemplate查询数据】
  6. 象棋名手手机版2019最新版_天天象棋2019版下载
  7. 下载文件根据浏览器判断文件名,解决兼容性问题
  8. springboot读取properties(yml)的几种常用方式
  9. 微信小程序点击图片放大图片
  10. matlab滤波函数imfilter、生成掩模函数fspecial
  11. div水平垂直居中的常用方法
  12. 7-5 约分最简分式
  13. 个人开发作品分享:iTab新标签页
  14. php报错:PHP Startup Unable to load dynamic library
  15. 【洋葱软件库-洋葱分享库】
  16. ZZULIOJ【1088】手机短号【输入输出格式】
  17. 【实训总结】Python从入门到前端知识小结,再到Flask框架搭建在线书城~
  18. mysql计算折纸_折纸飞机实验报告.doc
  19. 原神倾听木簧笛的八音曲寻找缺失的石头怎么做
  20. Neo4j Cypher查询语言详解

热门文章

  1. 举例说明语言接触会造成哪些结果_2008年10月语言学概论自考试题及答案
  2. Android APP性能及专项测试
  3. NGS数据分析实践:03. 涉及的常用数据格式[2] - sam/bam格式
  4. LV2之-----js 值类型和引用类型(基石1)
  5. oracle关键字pivot行转列
  6. 后台java 实现验证码生成
  7. android miracast投屏,MIRACAST投屏功能
  8. 下载量和Vue一样大的开源软件被作者恶意破坏,数千款应用受到牵连
  9. 监控物联卡怎么选套餐合适?
  10. jdk安装遇到cab文件损坏问题