http://www.lydsy.com/JudgeOnline/problem.php?id=2732

题意:给你n个靶子,让你求是否有一个经过原点的抛物线经过最多的前k个靶子,求出最大的k

思路:

就是这样的形式:y1<=ax^2+bx<=y2,这里y1,y2,x是已知的,有多组,我们发现,变量只有a和b了,而且都是一次,这样就转换成二元一次不等式组,这个问题就是高二学过的线性规划了

可以把它转换成半平面交,然后二分答案就可以了。

坑点:TM BZOJ上面要用longdouble,不然会WA一发,还有,考试的时候我居然在二分里面排序,导致复杂度退化到nlog^2 n T_T,这点要记住了。

 #include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#define dou long double
const dou inf=1e15;
int tot,n;
struct Point{
dou x,y;
Point(){}
Point(dou x0,dou y0):x(x0),y(y0){}
};
struct Line{
Point s,e;
dou slop;
int id;
Line(){}
Line(Point s0,Point e0):s(s0),e(e0){}
}l[],c[],L[];
int read(){
int t=,f=;char ch=getchar();
while (ch<''||ch>''){if (ch=='-')f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
dou operator *(Point p1,Point p2){
return p1.x*p2.y-p1.y*p2.x;
}
Point operator -(Point p1,Point p2){
return Point(p1.x-p2.x,p1.y-p2.y);
}
bool cmp(Line p1,Line p2){
if (p1.slop==p2.slop) return (p2.e-p1.s)*(p1.e-p1.s)>=;
else return p1.slop<p2.slop;
}
Point inter(Line p1,Line p2){
dou k1=(p2.e-p1.s)*(p1.e-p1.s);
dou k2=(p1.e-p1.s)*(p2.s-p1.s);
dou t=(k2)/(k1+k2);
dou x=p2.s.x+(p2.e.x-p2.s.x)*t;
dou y=p2.s.y+(p2.e.y-p2.s.y)*t;
return Point(x,y);
}
bool jud(Line p1,Line p2,Line p3){
Point p=inter(p1,p2);
return (p-p3.s)*(p3.e-p3.s)>;
}
bool check(int mid){
int Tot=;
for (int i=;i<=tot;i++)
if (l[i].id<=mid) L[++Tot]=l[i];
int cnt=;
for (int i=;i<=Tot;i++)
if (L[i].slop!=L[i-].slop) L[++cnt]=L[i];
int ll=,rr=;
c[]=L[];c[]=L[];
for (int i=;i<=Tot;i++){
while (ll<rr&&jud(c[rr],c[rr-],L[i])) rr--;
while (ll<rr&&jud(c[ll],c[ll+],L[i])) ll++;
c[++rr]=L[i];
}
while (ll<rr&&jud(c[rr],c[rr-],c[ll])) rr--;
while (ll<rr&&jud(c[ll],c[ll+],c[rr])) ll++;
if (rr-ll+<) return ;
else return ;
}
int main(){
n=read();
l[++tot].s=Point(-inf,inf);l[tot].e=Point(-inf,-inf);
l[++tot].s=Point(-inf,-inf);l[tot].e=Point(inf,-inf);
l[++tot].s=Point(inf,-inf);l[tot].e=Point(inf,inf);
l[++tot].s=Point(inf,inf);l[tot].e=Point(-inf,inf);
for (int i=;i<=n;i++){
dou x=read(),y1=read(),y2=read();
l[++tot].s.x=-;l[tot].s.y=y1/x-(-)*x;
l[tot].e.x=;l[tot].e.y=y1/x-x;
l[tot].id=i;
l[++tot].s.x=;l[tot].s.y=y2/x-x;
l[tot].e.x=-;l[tot].e.y=y2/x+x;
l[tot].id=i;
}
for (int i=;i<=tot;i++) l[i].slop=atan2(l[i].e.y-l[i].s.y,l[i].e.x-l[i].s.x);
std::sort(l+,l++tot,cmp);
int LL=,RR=n,ans=;
while (LL<=RR){
int mid=(LL+RR)>>;
if (check(mid)) ans=mid,LL=mid+;
else RR=mid-;
}
printf("%d",ans);
}

BZOJ 2732 射箭的更多相关文章

  1. bzoj 2732 射箭 半平面交

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

  2. BZOJ 2732: [HNOI2012]射箭

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

  3. bzoj 2732: [HNOI2012]射箭 半平面交

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=2732 题解: 这道题的做法我不想说什么了... 其他题解都有说做法... 即使是我上午做 ...

  4. POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流)

    POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流) Description Yo ...

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

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

  6. [HNOI2012]射箭

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

  7. [HNOI2012][BZOJ2732] 射箭 [二分+半平面交]

    题面 BZOJ题面 思路 半平面交代码讲解戳这里,用的就是这道题 我们射箭的函数形如$y=Ax^2+Bx$ 考虑每一个靶子$(x_0,y_1,y_2)$,实际上是关于$A,B$的不等式限制条件 我们只 ...

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

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

  9. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

随机推荐

  1. makefile高级用法--使用函数

    makefile高级用法--使用函数 分类: C/C++ 使用函数 ———— 在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能.make所支持的函数也不算很多, ...

  2. 【转】Android:控件Spinner实现下拉列表

    原文网址:http://www.cnblogs.com/tinyphp/p/3858920.html 在Web开发中,HTML提供了下拉列表的实现,就是使用<select>元素实现一个下拉 ...

  3. ASP.NET获取IP的6种方法(转载于LanceZhang's Tech Blog)

    服务端: //方法一 HttpContext.Current.Request.UserHostAddress; //方法二 HttpContext.Current.Request.ServerVari ...

  4. css实现居中的各种方法

    css垂直居中有很多种方法,可以参考下这个网站

  5. [置顶] Win8.1慎用360优化,可能导致安装驱动出现数据无效的问题。附解决方法

    2013年9月30日,更新说明: 不知道是不是我禁用了其他驱动造成 今天开机后连接手机,我的电脑里没出现MTP设备 于是打开设备管理器,发现MTP,也就是我的XPERIA U出现了感叹号图标 右键更新 ...

  6. HDU4662+无

    把目标中的 U 转化为 I. 又因为 I的个数是有规律的:1 2 4 8 16 ...再结合可以取消 6 12 18 ...个I...得解 #include<string.h> #incl ...

  7. Java基础知识强化56:经典排序之快速排序(QuickSort)

    1. 快速排序的原理: 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其 ...

  8. Windows 右键快速运行命令行

    原文见:右键命令行 - yacper - 博客园 方法一:配置文件夹选项 1 打开人任意文件夹,[工具] --> [文件夹选项] --> [文件类型] --> [(无)资料夹] -- ...

  9. 掌众android面试题

    1,android动画分类? http://www.cnblogs.com/angeldevil/archive/2011/12/02/2271096.html 2,android service启动 ...

  10. 反射那些事儿——Java动态装载和反射技术

    一直以来反射都是只闻其声,却无法将之使用,近日尽心下来学习下,发现了很多精妙之处. Java动态装载和反射技术 一.类的动态装载 1.Java代码编译和执行的整个过程包含了以下三个重要的机制: ● J ...