很久没写题解了= =,来水一发吧= =

首先这道题很明显就是求y=ax^2+bx的是否有值取,每一个式子都代表着两个半平面,然后直接半平面交就行了

借鉴了hzwer的代码,还是特别简洁的说

CODE:

#include<cstdio>

#include<iostream>

#include<algorithm>

#include<cstring>

#include<cmath>

using namespace std;

typedef pair<long double,long double> ii;

typedef pair<ii,ii> line;

#define fi first

#define se second

#define maxn 101000

#define inf 1e15

#define exp 0

inline long double cross(ii x,ii y,ii z) {

return (x.fi-y.fi)*(x.se-z.se)-(x.se-y.se)*(x.fi-z.fi);

}

bool cmp(line x,line y) {return cross(x.fi,x.se,y.fi)>exp;}

line q[maxn*2];

long double tag[maxn*2];

bool cmp1(int x,int y) {if (tag[x]==tag[y]) return cmp(q[x],q[y]);return tag[x]<tag[y];}

int l;

inline void init(){

q[1]=line(ii(-inf,-inf),ii(inf,-inf));

q[2]=line(ii(inf,-inf),ii(inf,inf));

q[3]=line(ii(inf,inf),ii(-inf,inf));

q[4]=line(ii(-inf,inf),ii(-inf,-inf));

l=4;

}

ii inter(line a,line b) {

long double k1,k2,t;

k1=cross(a.fi,b.se,a.se);

k2=cross(a.fi,a.se,b.fi);

t=k2/(k1+k2);

return ii(b.fi.fi+t*(b.se.fi-b.fi.fi),b.fi.se+t*(b.se.se-b.fi.se));

}

bool jud(line a,line b,line t) {

ii p=inter(a,b);

return cross(t.fi,p,t.se)>exp;

}

line a[maxn*2],deq[maxn*2];

int id[maxn*2];

inline bool check(int n) {

int num=0;

for (int i=1;i<=l;i++) if (id[i]<=n*2) a[++num]=q[id[i]];

int l,r;

deq[r=l=1]=a[1];

for (int i=2;i<=n*2;i++) {

while (r>l&&jud(deq[r-1],deq[r],a[i])) r--;

while (l<r&&jud(deq[l+1],deq[l],a[i])) l++;

deq[++r]=a[i];

}

while (l<r&&jud(deq[r-1],deq[r],deq[l])) r--;

while (l<r&&jud(deq[l+1],deq[l],deq[r])) l++;

return r-l>=2;

}

long double cal(long double a,long double b,long double x) {return b/a-a*x;}

int main(){

int n;

scanf("%d",&n);

init();

for (int i=1;i<=n;i++) {

int x1,y1,y2;

scanf("%d%d%d",&x1,&y1,&y2);

q[++l]=line(ii(-1,cal(x1,y1,-1)),ii(1,cal(x1,y1,1)));

q[++l]=line(ii(1,cal(x1,y2,1)),ii(-1,cal(x1,y2,-1)));

}

for (int i=1;i<=n*2+4;i++) {tag[i]=atan2(q[i].se.se-q[i].fi.se,q[i].se.fi-q[i].fi.fi);id[i]=i;}

sort(id+1,id+1+n*2+4,cmp1);

int l=2,r=n+2;

while (l+1<r) {

int mid=(l+r)>>1;

if (check(mid)) l=mid;

else r=mid;

}

printf("%d\n",check(r)?r-2:l-2);

return 0;

}

2732: [HNOI2012]射箭( 半平面交 )的更多相关文章

  1. BZOJ 2732: [HNOI2012]射箭

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

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

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

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

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

  4. [HNOI2012]射箭

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

  5. 【POJ 3525】Most Distant Point from the Sea(直线平移、半平面交)

    按逆时针顺序给出n个点,求它们组成的多边形的最大内切圆半径. 二分这个半径,将所有直线向多边形中心平移r距离,如果半平面交不存在那么r大了,否则r小了. 平移直线就是对于向量ab,因为是逆时针的,向中 ...

  6. 【BZOJ-2618】凸多边形 计算几何 + 半平面交 + 增量法 + 三角剖分

    2618: [Cqoi2006]凸多边形 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 959  Solved: 489[Submit][Status] ...

  7. 【CSU1812】三角形和矩形 【半平面交】

    检验半平面交的板子. #include <stdio.h> #include <bits/stdc++.h> using namespace std; #define gg p ...

  8. 简单几何(半平面交+二分) LA 3890 Most Distant Point from the Sea

    题目传送门 题意:凸多边形的小岛在海里,问岛上的点到海最远的距离. 分析:训练指南P279,二分答案,然后整个多边形往内部收缩,如果半平面交非空,那么这些点构成半平面,存在满足的点. /******* ...

  9. poj 3335(半平面交)

    链接:http://poj.org/problem?id=3335     //大牛们常说的测模板题 ------------------------------------------------- ...

随机推荐

  1. MySQL常用命令(参考资料,部分改动)

    一.连接MYSQL 格式: mysql -h主机地址 -u用户名 -p用户密码 . 连接到本机上的MYSQL. 首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root ...

  2. radiobutton设置样式

    单选题里会用到radiobutton,如果不想使用系统提供的圆圈样式,可以自定义样式,想要做成的效果就是, 使用自定义的图片替换圆圈,然后选择有4个选项的其中一个,图片上有个对勾标记, 然后如果正确选 ...

  3. Rest Project Performace Pressure Test

    首次调整基线和配置修改 机器配置为 CPU: Intel(R) Xeon(R) CPU E5-2630 v2 @ 2.6GHz 24core 内存: 128G JDK Ver: 1.7.0_80 To ...

  4. osgEarth编译(转载)

    osgEarth编译 osgEarth的编译需要osg和一些第三方插件库,我主要参考了cnblogs上的一篇博文,但是也不够详细,并且我是在已经编译好osg的情况下去编译osgEarth,所以期间也遇 ...

  5. Win7 x64 Eclipse无法识别手机 / adb interface有黄色感叹号,无法识别

    今天公司停电,因此把安卓项目带回宿舍做.宿舍的笔记本,装的是Win7 x64,手机连上电脑后,windows可以识别,但Eclipse的DDMS中却无法识别,什么都没有: 然后打开设备管理器查看,发现 ...

  6. [转]编写高性能的Lua代码

    昨天晚上闲来无事,看室友在电脑上挂机玩游戏,用的一个辅助脚本,以为是lua写的脚本在跑,实际调查发现是按键精灵的脚本. 于是在网上找相关Lua开发游戏脚本的案例,看到一个人的博客,内容很不错,学到了很 ...

  7. C++中的输入参考

    1.输入输出 1)operator>> 参考:cplusplus.com Extracts characters from is and stores them in s as a c-s ...

  8. java中Integer比较需要注意的问题

    java中Integer比较需要注意的问题 package com.srie.test; import java.util.HashMap; import java.util.Map; public ...

  9. CCNA网络工程师学习进程(8)访问控制列表ACL

    前面几节我们介绍了路由器的路由配置,接下来几节我们将介绍路由器的高级配置应用,包括ACL.NAT.DHCP.PPP.VPN和远程连接等的配置.     (1)ACL概述:   ACL(Access C ...

  10. Bootstrap入门(二十)组件14:警告框

    Bootstrap入门(二十)组件14:警告框 警告框组件通过提供一些灵活的预定义消息,为常见的用户动作提供反馈消息,提示.通知或者警示,可以迅速吸引注意力. 1.情景警告框 2.可关闭的警告框 3. ...