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. AC自动机修正

    #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #inc ...

  2. Google Code Jam 2012 round 2 problem A: Swinging Wild

    题目连接 题意:你要从起点经过绳子荡到终点,每次你必须抓住另一个绳子,在空中不能向下爬.问是否有合理的方案 做法: 直接模拟 #include <iostream> #include &l ...

  3. 玩转docker

    开篇先论赌 (组词,赌博,....),时刻,每天都在赌! 何为赌?仁者见仁,智者必定又有一番见解,保持沉默,意见保留; ——改变思维模式,Ruiy让赌赢在“思维”!!!; 存在在IT界Ruiy定格,即 ...

  4. 使用java创建kafka的生产者和消费者

    创建一个Kafka的主题,连接到zk集群,副本因子3,分区3,主题名是test111        [root@h5 kafka]# bin/kafka-topics.sh --create --zo ...

  5. char和int的转换

    import java.util.Scanner; public class test7 { public static void main(String[] args) { // TODO Auto ...

  6. appium 并发测试

    Android并发测试 Appium提供了在一台设备上启动多个Android会话的方案,而这个方案需要你输入不同的指令来启动多个Appium服务来实现. 启动多个Android会话的重要指令包括: - ...

  7. @property属性关键字

    关于@property属性关键字使用注意:* weak(assign) :  代理\UI控件* strong(retain) : 其他对象(除代理\UI控件\字符串以外的对象)* copy : 字符串 ...

  8. uvalive 4851 Restaurant(扫描法)

    题意:有一个M*M的网格,坐标[0...M-1,0...M-1] 网格里面有两个y坐标同样的宾馆A和B.以及n个餐厅,宾馆AB里面各有一个餐厅,编号1,2,其它餐厅编号3-n.如今你打算新开一家餐厅. ...

  9. 经常使用ASCII码表(方便查找)

    经常使用ASCII码表(方便查找) 键盘 ASCII码 键盘 ASCII码 键盘 ASCII码 键盘 ASCII码 ESC 27 7 55 O 79 g 103 SPACE 32 8 56 P 80 ...

  10. view动画库

    Android View Animations这个项目收集了各种有趣的动画效果. 所有效果: Attension Flash, Pulse, RubberBand, Shake, Swing, Wob ...