刷题总结——射箭(bzoj2732)
题目:
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
2 8 12
5 4 5
3 8 10
6 2 3
1 3 7
Sample Output
HINT
.jpg)
题解
这里引用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)的更多相关文章
- LeetCode刷题系列
LeetCode 我们工作面试和提高自身数据结构和算法能力的时候往往需要刷刷题,我选择LeetCode是通过一个留学论坛了解的.专业,覆盖语种全面. 提前说说刷题的心得: 尽量手写代码,少使用IDE的 ...
- ife任务刷题总结(一)-css reset与清除浮动
本文同时发布于本人的个人网站www.yaoxiaowen.com 百度创办的前端技术学院,是一个面向大学生的前端技术学习平台.虽然只有大学生才有资格报名,提交代码进行比赛排名.但是这并不妨碍我们这些初 ...
- 刷题ING...
我用codeVS刷题.. 努力准备!!
- XidianOJ 1020 ACMer去刷题吧
题目描述 刷题是每个ACMer必由之路,已知某oj上有n个题目,第i个题目小X能做对的概率为Pi(0<=Pi<=1,1<=i<=n) 求小X至少做对k道题的概率 输入 第一行输 ...
- 【BZOJ-4590】自动刷题机 二分 + 判定
4590: [Shoi2015]自动刷题机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 156 Solved: 63[Submit][Status ...
- NOI题库分治算法刷题记录
今天晚自习机房刷题,有一道题最终WA掉两组,极其不爽,晚上回家补完作业欣然搞定它,特意来写篇博文来记录下 (最想吐槽的是这个叫做分治的分类,里面的题目真的需要分治吗...) 先来说下分治法 分治法的设 ...
- NOI题库刷题日志 (贪心篇题解)
这段时间在NOI题库上刷了刷题,来写点心得和题解 一.寻找平面上的极大点 2704:寻找平面上的极大点 总时间限制: 1000ms 内存限制: 65536kB 描述 在一个平面上,如果有两个点( ...
- 用js刷题的一些坑
leecode可以用js刷题了,我大js越来越被认可了是吧.但是刷题中会因为忽略js的一些特性掉入坑里.我这里总结一下我掉过的坑. 坑1:js中数组对象是引用对象 js中除了object还有数组对象也 ...
- BZOJ4590 自动刷题机
Description 曾经发明了信号增幅仪的发明家SHTSC又公开了他的新发明:自动刷题机--一种可以自动AC题目的神秘装置.自动 刷题机刷题的方式非常简单:首先会瞬间得出题目的正确做法,然后开始写 ...
随机推荐
- 设置office首字母不变大小的手段
选项->校对—〉自动更正选项->“自动更正”页,句首字母大写,取消就行了
- c#网站对服务器的数据库的备份与还原
在网站上备份数据库 1.前台页面 <div> 需要备份的文件名:<asp:TextBox ID="bfFile" runat="server" ...
- navicate连接mysql
1. 打开navicate,选择连接 2. 编辑连接属性 编辑完成之后,连接成功.
- block总结我的
1) struct Block_descriptor { unsigned long int reserved; unsigned long int size; void (*copy)(void * ...
- BZOJ1009: [HNOI2008]GT考试 (矩阵快速幂 + DP)
题意:求一个长度为n的数字字符串 (n <= 1e9) 不出现子串s的方案数 题解:用f i,j表示长度为i匹配到在子串j的答案 用kmp的失配函数预处理一下 然后这个转移每一个都是一样的 所以 ...
- shell脚本,对MySQL数据库进行分库加分表备份
[root@localhost wyb]# cat table_backup.sh #!/bin/bash flag= user=root pass=test mysql -u$user -p&quo ...
- java在线聊天项目1.1版 ——开启多个客户端,分别实现注册和登录功能,使用客户端与服务端信息request机制,重构线程,将单独的登录和注册线程合并
实现效果图: eclipse项目中初步整合之前的各个客户端和服务端的窗口与工具类,效果如下图: 已将注册服务器线程RegServer功能放到LoginServer中,使用客户端与服务端的request ...
- Core Animation演示
相关代码展示: - (IBAction)toggleRoundCorners:(id)sender { [CATransaction setDisableActions:![_enableAnimat ...
- 黑苹果10.10.3手动开启SSD的TIRM提高硬盘效率
黑苹果10.10.3手动开启SSD的TIRM提高硬盘效率 文章前言 其实开启TIRM的方法有很多,比如用Clover注入的方式或者用其他的工具来方便完成,但是10.10.3刚刚出来有些工具还没有更新的 ...
- 初涉tarjan缩点
tarjan缩点:口胡过好多题,不过从来没写过…… 什么是缩点 tarjan和Kosaraju.Gabow算法一样,是为了求有向图中的强连通分量.因为有向图中大多数情况下会有环存在,而有环是一个不甚好 ...