Description

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

Input

第一行是一个正整数$N$,表示一共有$N$关。

接下来有$N$行,第$i+1$行是用空格隔开的三个正整数$x_i,y_{i,1},y_{i,2}(y_{i,1}<y_{i,2})$,表示第$i$关出现的靶子的横坐标是$x_i$,纵坐标的范围是从$y_{i,1}$到$y_{i,2}$。 

Output

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

Sample Input

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

Sample Output

3

HINT

$N\;\leq\;100000$,且给出的所有坐标不超过$10^9$。 

Solution

二分$K$.

对于前$K$关,如果能过,则存在一条抛物线$y=ax^2+bx$,满足$y_{i,1}\;\leq\;ax_i^2+bx_i\;\leq\;y_{i,2}$,即关于$a,b$的不等式方程组$ax_i^2+bx_i-y_{i,1}\;\geq\;0,ax_i^2+bx_i-y_{i,2}\;\leq\;0$有解.

即求半平面交.

#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 200010
#define eps 1e-13
#define INF 1e15
using namespace std;
typedef long double ld;
struct point{
ld x,y;
}p[N];
struct line{
point s,e;int n;ld an;
}l[N],a[N],q[N];
int n,m,h,t,lef,rig,mid,cnt;
inline int read(){
int ret=0;char c=getchar();
while(!isdigit(c))
c=getchar();
while(isdigit(c)){
ret=(ret<<1)+(ret<<3)+c-'0';
c=getchar();
}
return ret;
}
inline ld rd(){
int ret=0;char c=getchar();
while(!isdigit(c))
c=getchar();
while(isdigit(c)){
ret=(ret<<1)+(ret<<3)+c-'0';
c=getchar();
}
return (ld)(ret);
}
inline ld sqr(ld x){
return x*x;
}
inline point add(point x,point y){
return (point){x.x+y.x,x.y+y.y};
}
inline point dec(point x,point y){
return (point){x.x-y.x,x.y-y.y};
}
inline point mul(point x,point y){
return (point){x.x*y.x,x.y*y.y};
}
inline point div(point x,point y){
return (point){x.x/y.x,x.y/y.y};
}
inline ld mult(point x,point y){
return x.x*y.y-x.y*y.x;
}
inline bool cmp(line x,line y){
if(x.an==y.an) return mult(dec(x.e,x.s),dec(y.s,x.s))>0;
return x.an<y.an;
}
inline point inter(line a,line b){
ld s1,s2,t;point ret;
s1=mult(dec(b.e,a.s),dec(a.e,a.s));
s2=mult(dec(a.e,a.s),dec(b.s,a.s));
t=s2/(s1+s2);
ret.x=b.s.x+(b.e.x-b.s.x)*t;
ret.y=b.s.y+(b.e.y-b.s.y)*t;
return ret;
}
inline bool chk(line x,line y,line z){
point a=inter(x,y);
return mult(dec(a,z.s),dec(z.e,z.s))>0;
}
inline bool hpi(int k){
cnt=0;
for(int i=1;i<=m;++i)
if(l[i].n<=k){
if(!cnt||l[i].an!=a[cnt].an) ++cnt;
a[cnt]=l[i];
}
h=1;t=0;
for(int i=1;i<=cnt;++i){
while(h<t&&chk(q[t],q[t-1],a[i])) --t;
while(h<t&&chk(q[h],q[h+1],a[i])) ++h;
q[++t]=a[i];
}
while(h<t&&chk(q[t],q[t-1],q[h])) --t;
while(h<t&&chk(q[h],q[h+1],q[t])) ++h;
return t-h+1>=3;
}
/*a^2x+ay-b=0,ask y*/
inline ld f(ld a,ld b,ld x){
return b/a-a*x;
}
inline void Aireen(){
n=read();ld x,y,z;
l[++m].s=(point){-INF,-INF};l[m].e=(point){INF,-INF};
l[m].an=atan2(l[m].e.y-l[m].s.y,l[m].e.x-l[m].s.x);
l[++m].s=(point){INF,-INF};l[m].e=(point){INF,INF};
l[m].an=atan2(l[m].e.y-l[m].s.y,l[m].e.x-l[m].s.x);
l[++m].s=(point){INF,INF};l[m].e=(point){-INF,INF};
l[m].an=atan2(l[m].e.y-l[m].s.y,l[m].e.x-l[m].s.x);
l[++m].s=(point){-INF,INF};l[m].e=(point){-INF,-INF};
l[m].an=atan2(l[m].e.y-l[m].s.y,l[m].e.x-l[m].s.x);
for(int i=1;i<=n;++i){
x=rd();y=rd();z=rd();
l[++m].s.x=-1.0;l[m].s.y=f(x,y,l[m].s.x);
l[m].e.x=1.0;l[m].e.y=f(x,y,l[m].e.x);
l[m].n=i;l[m].an=atan2(l[m].e.y-l[m].s.y,l[m].e.x-l[m].s.x);
l[++m].s.x=1.0;l[m].s.y=f(x,z,l[m].s.x);
l[m].e.x=-1.0;l[m].e.y=f(x,z,l[m].e.x);
l[m].n=i;l[m].an=atan2(l[m].e.y-l[m].s.y,l[m].e.x-l[m].s.x);
}
sort(l+1,l+1+m,cmp);
lef=0;rig=n;
while(lef<rig){
mid=lef+rig+1>>1;
if(hpi(mid)) lef=mid;
else rig=mid-1;
}
printf("%d\n",lef);
}
int main(){
freopen("archery.in","r",stdin);
freopen("archery.out","w",stdout);
Aireen();
fclose(stdin);
fclose(stdout);
return 0;
}

[bzoj2732][HNOI2012]射箭的更多相关文章

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

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

  2. BZOJ 2732: [HNOI2012]射箭

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

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

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

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

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

  5. [HNOI2012]射箭

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

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

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

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

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

  8. [HNOI2012]射箭(计算几何)

    设抛物线方程\(y = ax^2 + bx\), 那么对于一个靶子\((x_i,y_{down},y_{up})\)我们需要满足的条件就是 \(\frac{y_{down}}{x_i} \leq ax ...

  9. Luogu-3222 [HNOI2012]射箭

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

随机推荐

  1. PHP HTTP请求

    stream_context_create 1.curl仍然是最好的HTTP库,没有之一. 可以解决任何复杂的应用场景中的HTTP 请求2. 文件流式的HTTP请求比较适合处理简单的HTTP POST ...

  2. 深入理解js的变量提升和函数提升

    一.变量提升 在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域.变量提升即将变量声明提升到它所在作用域的最开始的部分.上个简历的例子如: ...

  3. 如何解决MSI类型的Sharepoint Server2016 安装即点即用的office 2016 plus问题

    前提 在sharepoint server 2016安装office 2016 plus提示如下错误: 解决方法 Ø 概念 1. 即点和即用的概念:即点即用是一种通过 Internet 安装和更新 O ...

  4. 详解Paint的setXfermode(Xfermode xfermode)

    一.setXfermode(Xfermode xfermode) Xfermode国外有大神称之为过渡模式,这种翻译比较贴切但恐怕不易理解,大家也可以直接称之为图像混合模式,因为所谓的“过渡”其实就是 ...

  5. Android中使用Notification实现进度通知栏(Notification示例三)

    我们在使用APP的过程中,软件会偶尔提示我们进行版本更新,我们点击确认更新后,会在通知栏显示下载更新进度(已知长度的进度条)以及安装情况(不确定进度条),这就是我们今天要实现的功能.实现效果如下: 在 ...

  6. 手机游戏渠道SDK接入工具项目分享(一)缘起

    #剧情章节 # 上周刚结束一个外包的项目,开发手机游戏渠道SDK聚合接入工具的,现在有空回顾整理一下这个项目开发过程,因涉嫌商业秘密不会提供项目代码,只谈下开发思路和掉过的坑. 本人多年从事手机互联网 ...

  7. freeswitch注册过程分析

    操作系统:debian8.5_x64freeswitch 版本 : 1.6.8 本文仅描述sip注册的简单场景,即话机直接向处于同一个局域网的fs进行注册. SIP协议的消息结构 消息框架 SIP协议 ...

  8. 3Sum algorithm - 非常容易理解的实现 (java)

    原题重述:(点击图片可以进入来源链接) 这到题目的中文解释是, 输入一个数组,例如{-1 0 1 2 -1 -4},从数组中找三个数(a,b,c),使得其和0,输出所有的(a,b,c)组合. 要求ab ...

  9. 分享一个html+js+ashx+easyui+ado.net权限管理系统

    EasyUI.权限管理 这是个都快被搞烂了的组合,但是easyui的确好用,权限管理在项目中的确实用.一直以来博客园里也不少朋友分享过,但是感觉好的要不没源码,要不就是过度设计写的太复杂看不懂,也懒得 ...

  10. 【mysql】关于binlog格式

    写在前面的话 1.推荐用mixed,默认使用statement,基于上下文  set session/global binlog_format=mixed; 2.二进制日记录了数据库执行更改的操作,如 ...