2732: [HNOI2012]射箭( 半平面交 )
很久没写题解了= =,来水一发吧= =
首先这道题很明显就是求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]射箭( 半平面交 )的更多相关文章
- 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 题解: 这道题的做法我不想说什么了... 其他题解都有说做法... 即使是我上午做 ...
- [HNOI2012][BZOJ2732] 射箭 [二分+半平面交]
题面 BZOJ题面 思路 半平面交代码讲解戳这里,用的就是这道题 我们射箭的函数形如$y=Ax^2+Bx$ 考虑每一个靶子$(x_0,y_1,y_2)$,实际上是关于$A,B$的不等式限制条件 我们只 ...
- [HNOI2012]射箭
Description 沫沫最近在玩一个二维的射箭游戏,如下图 1 所示,这个游戏中的 x 轴在地面,第一象限中有一些竖直线段作为靶子,任意两个靶子都没有公共部分,也不会接触坐标轴.沫沫控制一个位于( ...
- 【POJ 3525】Most Distant Point from the Sea(直线平移、半平面交)
按逆时针顺序给出n个点,求它们组成的多边形的最大内切圆半径. 二分这个半径,将所有直线向多边形中心平移r距离,如果半平面交不存在那么r大了,否则r小了. 平移直线就是对于向量ab,因为是逆时针的,向中 ...
- 【BZOJ-2618】凸多边形 计算几何 + 半平面交 + 增量法 + 三角剖分
2618: [Cqoi2006]凸多边形 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 959 Solved: 489[Submit][Status] ...
- 【CSU1812】三角形和矩形 【半平面交】
检验半平面交的板子. #include <stdio.h> #include <bits/stdc++.h> using namespace std; #define gg p ...
- 简单几何(半平面交+二分) LA 3890 Most Distant Point from the Sea
题目传送门 题意:凸多边形的小岛在海里,问岛上的点到海最远的距离. 分析:训练指南P279,二分答案,然后整个多边形往内部收缩,如果半平面交非空,那么这些点构成半平面,存在满足的点. /******* ...
- poj 3335(半平面交)
链接:http://poj.org/problem?id=3335 //大牛们常说的测模板题 ------------------------------------------------- ...
随机推荐
- adb报错:The connection to adb is down, and a severe&nbs
我觉得这就像是adb的大姨妈一样,不过处理起来还是很easy滴: 1.报错:BUILD FAILEDD:\workspace\ganji\build.xml:144: The following e ...
- php __set()和__get()函数
<?php /* 总结: 1. 从一个难以访问的属性读取数据的时候 __get() 方法被调用 2. 向一个难以访问的属性赋值的时候 __set() 方法被调用 3. 难以访问包括:(1)私有属 ...
- CentOS6.5编译安装Redis
一.首先要检测是否安装gcc yum install gcc-c++ yum install -y tcl 进入redis目录 cd /usr/local/redis .编译安装 make make ...
- 关于String的相关常见方法
package Stirng类; /** * String 常见的相关方法摘要 * @author Administrator * */ public class DemoStringMethod { ...
- JAVA控制台输入输出方法总结
java的控制台输入输出有很多方法,此文分别对其进行介绍. 1.控制台的输入 关于控制台的输入主要介绍三种方法,第一种方法使用BufferedReader获得控制台输入的数据,此方法是传统的输入方法, ...
- JDBC连接sql server数据库的详细步骤和代码
JDBC连接sql server数据库的详细步骤和代码 JDBC连接sql server数据库的步骤如下: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Ja ...
- Xcache和memcache的比较
Xcache 和 memcached 是两个不同层面的缓存,不存在可比性. Xcache 是 php 底层的缓存,它将PHP程式编译成字节码(byte code),再透过服务器上安装对应的程式来执行P ...
- 常用的JavaScript字符串处理函数及用法
最近参加了几次前端实习生招聘的笔试,发现很多笔试题都会考到字符串的处理,比方说去哪儿网笔试题.淘宝的笔试题等,如果你经常参加笔试或者也是一个过来人,相信你也跟我一样,发现字符串的处理是前端招聘过程中最 ...
- 部署statspack工具(一)
禁用sga自动管理机制,分配比较小的数据缓冲区(30m)和共享池(70m)空间 1.1关闭SGA自动管理机制 查看是否开启了ASSM idle>show parameter sga; NAME ...
- 如何编译POCO
Poco C++库是: 一系列C++类库,类似Java类库,.Net框架,Apple的Cocoa; 侧重于互联网时代的网络应用程序 使用高效的,现代的标准ANSI/ISO C++,并基于STL 高可移 ...