BZOJ 2732 射箭
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 射箭的更多相关文章
- bzoj 2732 射箭 半平面交
2732: [HNOI2012]射箭 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2531 Solved: 848[Submit][Status] ...
- BZOJ 2732: [HNOI2012]射箭
2732: [HNOI2012]射箭 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2532 Solved: 849[Submit][Status] ...
- bzoj 2732: [HNOI2012]射箭 半平面交
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=2732 题解: 这道题的做法我不想说什么了... 其他题解都有说做法... 即使是我上午做 ...
- POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流)
POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流) Description Yo ...
- 2732: [HNOI2012]射箭( 半平面交 )
很久没写题解了= =,来水一发吧= = 首先这道题很明显就是求y=ax^2+bx的是否有值取,每一个式子都代表着两个半平面,然后直接半平面交就行了 借鉴了hzwer的代码,还是特别简洁的说 CODE: ...
- [HNOI2012]射箭
Description 沫沫最近在玩一个二维的射箭游戏,如下图 1 所示,这个游戏中的 x 轴在地面,第一象限中有一些竖直线段作为靶子,任意两个靶子都没有公共部分,也不会接触坐标轴.沫沫控制一个位于( ...
- [HNOI2012][BZOJ2732] 射箭 [二分+半平面交]
题面 BZOJ题面 思路 半平面交代码讲解戳这里,用的就是这道题 我们射箭的函数形如$y=Ax^2+Bx$ 考虑每一个靶子$(x_0,y_1,y_2)$,实际上是关于$A,B$的不等式限制条件 我们只 ...
- BZOJ2732:[HNOI2012]射箭——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=2732 https://www.luogu.org/problemnew/show/P3222#su ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
随机推荐
- AC自动机修正
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #inc ...
- Google Code Jam 2012 round 2 problem A: Swinging Wild
题目连接 题意:你要从起点经过绳子荡到终点,每次你必须抓住另一个绳子,在空中不能向下爬.问是否有合理的方案 做法: 直接模拟 #include <iostream> #include &l ...
- 玩转docker
开篇先论赌 (组词,赌博,....),时刻,每天都在赌! 何为赌?仁者见仁,智者必定又有一番见解,保持沉默,意见保留; ——改变思维模式,Ruiy让赌赢在“思维”!!!; 存在在IT界Ruiy定格,即 ...
- 使用java创建kafka的生产者和消费者
创建一个Kafka的主题,连接到zk集群,副本因子3,分区3,主题名是test111 [root@h5 kafka]# bin/kafka-topics.sh --create --zo ...
- char和int的转换
import java.util.Scanner; public class test7 { public static void main(String[] args) { // TODO Auto ...
- appium 并发测试
Android并发测试 Appium提供了在一台设备上启动多个Android会话的方案,而这个方案需要你输入不同的指令来启动多个Appium服务来实现. 启动多个Android会话的重要指令包括: - ...
- @property属性关键字
关于@property属性关键字使用注意:* weak(assign) : 代理\UI控件* strong(retain) : 其他对象(除代理\UI控件\字符串以外的对象)* copy : 字符串 ...
- uvalive 4851 Restaurant(扫描法)
题意:有一个M*M的网格,坐标[0...M-1,0...M-1] 网格里面有两个y坐标同样的宾馆A和B.以及n个餐厅,宾馆AB里面各有一个餐厅,编号1,2,其它餐厅编号3-n.如今你打算新开一家餐厅. ...
- 经常使用ASCII码表(方便查找)
经常使用ASCII码表(方便查找) 键盘 ASCII码 键盘 ASCII码 键盘 ASCII码 键盘 ASCII码 ESC 27 7 55 O 79 g 103 SPACE 32 8 56 P 80 ...
- view动画库
Android View Animations这个项目收集了各种有趣的动画效果. 所有效果: Attension Flash, Pulse, RubberBand, Shake, Swing, Wob ...