题目:

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

Sample Output

3

HINT

题解

这里引用hzwer的题解,orz····链接:http://hzwer.com/5404.html

设抛物线y=ax^2+bx

则y1<=ax1^2+bx1<=y2

ax1^2+bx1>=y1

=>bx1>=y1-ax1^2

=>b>=y1/x1-ax1

这样得到一个关于a,b的不等式。。。

每一关都是俩不等式。。。这就变成了半平面交问题

二分答案k,判1-k的不等式半平面交是否为空

复杂度nlogn

心得:

  半品面交两大模版题第二道···用于解多个ax+by>=(<=)b的不等式···,注意建边的时候用的是x=-1和x=1的两端点就行,但是···

  md一个精度卡了我半个小时啊··艹

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<cstring>
#include<string>
#include<algorithm>
#define double long double
using namespace std;
int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
const int inf=1e9+;
const int N=;
struct point
{
double x;
double y;
};
struct line
{
point a;
point b;
double slope;
int id;
}l[N],q[N],a[N];
int n,tot,cnt,le,ri;
long long x,ya,yb;
int ans;
inline point operator-(point a,point b)
{
point t;
t.x=a.x-b.x;
t.y=a.y-b.y;
return t;
}
inline double operator*(point a,point b)
{
return a.x*b.y-a.y*b.x;
}
double cal(double x,double y,double a)
{
return y/x-a*x;
}
bool comp(line a,line b)
{
if(a.slope==b.slope)return (a.b-a.a)*(b.a-a.a)>;
return a.slope<b.slope;
}
point inter(line a,line b)
{
double k1,k2,t;
k1=(b.b-a.a)*(a.b-a.a);
k2=(a.b-a.a)*(b.a-a.a);
t=k2/(k1+k2);
point p;
p.x=b.a.x+t*(b.b.x-b.a.x);
p.y=b.a.y+t*(b.b.y-b.a.y);
return p;
}
bool jud(line a,line b,line c)
{
point t=inter(a,b);
return (t-c.a)*(c.b-c.a)>;
}
void build(int x)
{
tot=;
for(int i=;i<=cnt;i++)
if(l[i].id<=x)
{
if(l[i].slope!=a[tot].slope)tot++;
a[tot]=l[i];
}
le=,ri=;
q[++ri]=a[];
q[++ri]=a[];
for(int i=;i<=tot;i++)
{
while(le<ri&&jud(q[ri],q[ri-],a[i])) ri--;
while(le<ri&&jud(q[le],q[le+],a[i])) le++;
q[++ri]=a[i];
}
while(le<ri&&jud(q[ri],q[ri-],q[le])) ri--;
while(le<ri&&jud(q[le],q[le+],q[ri])) le++;
}
int main()
{
//freopen("a.in","r",stdin);
scanf("%d",&n);
l[++cnt].a=(point){-inf,inf},l[cnt].b=(point){-inf,-inf};
l[++cnt].a=(point){-inf,-inf},l[cnt].b=(point){inf,-inf};
l[++cnt].a=(point){inf,-inf},l[cnt].b=(point){inf,inf};
l[++cnt].a=(point){inf,inf},l[cnt].b=(point){-inf,inf};
for(int i=;i<=n;i++)
{
scanf("%lld",&x);
scanf("%lld",&ya);
scanf("%lld",&yb);
l[++cnt].a.x=-,l[cnt].a.y=cal(x,ya,-);
l[cnt].b.x=,l[cnt].b.y=cal(x,ya,);
l[++cnt].a.x=,l[cnt].a.y=cal(x,yb,);
l[cnt].b.x=-,l[cnt].b.y=cal(x,yb,-);
l[cnt].id=l[cnt-].id=i;
}
for(int i=;i<=cnt;i++)
l[i].slope=atan2(l[i].b.y-l[i].a.y,l[i].b.x-l[i].a.x);
sort(l+,l+cnt+,comp);
int L=,R=n;
while(L<=R)
{
int mid=(L+R)/;
build(mid);
if(ri-le+>=)
{
ans=mid;
L=mid+;
}
else
R=mid-;
}
printf("%d",ans);
return ;
}

刷题总结——射箭(bzoj2732)的更多相关文章

  1. LeetCode刷题系列

    LeetCode 我们工作面试和提高自身数据结构和算法能力的时候往往需要刷刷题,我选择LeetCode是通过一个留学论坛了解的.专业,覆盖语种全面. 提前说说刷题的心得: 尽量手写代码,少使用IDE的 ...

  2. ife任务刷题总结(一)-css reset与清除浮动

    本文同时发布于本人的个人网站www.yaoxiaowen.com 百度创办的前端技术学院,是一个面向大学生的前端技术学习平台.虽然只有大学生才有资格报名,提交代码进行比赛排名.但是这并不妨碍我们这些初 ...

  3. 刷题ING...

    我用codeVS刷题.. 努力准备!!

  4. XidianOJ 1020 ACMer去刷题吧

    题目描述 刷题是每个ACMer必由之路,已知某oj上有n个题目,第i个题目小X能做对的概率为Pi(0<=Pi<=1,1<=i<=n) 求小X至少做对k道题的概率 输入 第一行输 ...

  5. 【BZOJ-4590】自动刷题机 二分 + 判定

    4590: [Shoi2015]自动刷题机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 156  Solved: 63[Submit][Status ...

  6. NOI题库分治算法刷题记录

    今天晚自习机房刷题,有一道题最终WA掉两组,极其不爽,晚上回家补完作业欣然搞定它,特意来写篇博文来记录下 (最想吐槽的是这个叫做分治的分类,里面的题目真的需要分治吗...) 先来说下分治法 分治法的设 ...

  7. NOI题库刷题日志 (贪心篇题解)

    这段时间在NOI题库上刷了刷题,来写点心得和题解 一.寻找平面上的极大点 2704:寻找平面上的极大点 总时间限制:  1000ms  内存限制:  65536kB 描述 在一个平面上,如果有两个点( ...

  8. 用js刷题的一些坑

    leecode可以用js刷题了,我大js越来越被认可了是吧.但是刷题中会因为忽略js的一些特性掉入坑里.我这里总结一下我掉过的坑. 坑1:js中数组对象是引用对象 js中除了object还有数组对象也 ...

  9. BZOJ4590 自动刷题机

    Description 曾经发明了信号增幅仪的发明家SHTSC又公开了他的新发明:自动刷题机--一种可以自动AC题目的神秘装置.自动 刷题机刷题的方式非常简单:首先会瞬间得出题目的正确做法,然后开始写 ...

随机推荐

  1. 当ThreadLocal碰上线程池

    ThreadLocal使用 ThreadLocal可以让线程拥有本地变量,在web环境中,为了方便代码解耦,我们通常用它来保存上下文信息,然后用一个util类提供访问入口,从controller层到s ...

  2. SQLite-表达式

    SQLite -表达式 一个表达式是一个或多个值的组合,运算符和SQL函数,评价一个值. SQL表达式就像公式和都写在查询语言.您还可以使用为特定的数据集查询数据库. 语法: 考虑到SELECT语句的 ...

  3. Python基础篇 -- 部分练习题

    实现一个整数加法计算器(两个数相加): 如:content = input("请输入内容:") 用户输入:5+9或5+ 9或5 + 9(含空白),然后进行分割转换最终进行整数的计算 ...

  4. Bootstrap 网格系统(Grid System)实例5

    Bootstrap 网格系统(Grid System)实例5:手机,平板电脑,笔记本或台式电脑 <!DOCTYPE html><html><head><met ...

  5. 带你进入Angular js的大门

    首先需要指出什么是angular js,其实说白了angular js就是Javascript的一个类库,我们使用这个类库可以很容易的创建web页面.双向绑定是angular js其中的一个重要特征, ...

  6. 【二分】bestcoder p1m2

    模型的转化和二分check的细节挺不错的 Problem Description 度度熊很喜欢数组!! 我们称一个整数数组为稳定的,若且唯若其同时符合以下两个条件: 数组里面的元素都是非负整数. 数组 ...

  7. 【tarjan 拓扑排序 dp】bzoj1093: [ZJOI2007]最大半连通子图

    思维难度不大,关键考代码实现能力.一些细节还是很妙的. Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于 ...

  8. 【OS_Linux】Linux下软件的安装与卸载

    1.Linux中软件安装包的分类 1) 一类是可执行的软件包,无需编译直接安装.在Windows中所有的软件包都是这种类型.安装完这个程序后,你就可以使用,但你看不到源程序.而且下载时要注意这个软件是 ...

  9. Git学习——版本切换

    版本回退 回退到前面几个版本的命令如下: git reset --hard HEAD^ //回退到前一个版本 git reset --hard HEAD^^ //回退到前前一个版本 git reset ...

  10. node.js中常用的fs文件系统

    fs文件系统模块对于系统文件及目录进行一些读写操作. 模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync(). 异步的 ...