BZOJ2961: 共点圆
好久没发了
CDQ分治,具体做法见XHR的论文…
/**************************************************************
Problem: 2961
User: zhuohan123
Language: C++
Result: Accepted
Time:5060 ms
Memory:41704 kb
****************************************************************/ #include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const double eps=1e-,inf=1e12;
struct point
{
double x,y;
point(){x=y=;}
point(double X,double Y){x=X,y=Y;}
friend bool operator<(point a,point b)
{
if(abs(a.x-b.x)<eps)return a.y+eps<b.y;
else return a.x+eps<b.x;
}
};
inline point V(point s,point e){return point(e.x-s.x,e.y-s.y);}
inline double crossP(point a,point b){return a.x*b.y-b.x*a.y;}
inline double dotP(point a,point b){return a.x*b.x+a.y*b.y;}
struct T{int ispo;point o;}q[];
point t[];int tnum;
point up[];int unum;
point dw[];int dnum;
bool ans[];
void imerge(int l,int r)
{
if(l==r)return ;
int mid=(l+r)/;
imerge(l,mid);imerge(mid+,r);
tnum=;
for(int i=l;i<=mid;i++)
if(!q[i].ispo)t[++tnum]=q[i].o;
sort(t+,t+tnum+);
unum=;
for(int i=;i<=tnum;i++)
{
while(unum>&&crossP(V(up[unum-],up[unum]),V(up[unum],t[i]))>-eps)unum--;
up[++unum]=t[i];
}
up[unum+].x=up[unum].x+eps;up[unum+].y=-inf;
dnum=;
for(int i=tnum;i;i--)
{
while(dnum>&&crossP(V(dw[dnum-],dw[dnum]),V(dw[dnum],t[i]))>-eps)dnum--;
dw[++dnum]=t[i];
}
dw[dnum+].x=dw[dnum].x-eps;dw[dnum+].y=inf;
if(tnum!=)
for(int i=mid+;i<=r;i++)
if(q[i].ispo&&ans[i])
{
point near;
if(q[i].o.y<)
{
int L=,R=unum;
while(L<=R)
{
int Mid=(L+R)/;
if(dotP(q[i].o,V(up[Mid],up[Mid+]))>-eps)near=up[Mid],R=Mid-;
else L=Mid+;
}
}
else
{
int L=,R=dnum;
while(L<=R)
{
int Mid=(L+R)/;
if(dotP(q[i].o,V(dw[Mid+],dw[Mid]))<eps)near=dw[Mid],R=Mid-;
else L=Mid+;
}
}
if(*near.x*q[i].o.x+*near.y*q[i].o.y-q[i].o.x*q[i].o.x-q[i].o.y*q[i].o.y<eps)ans[i]=false;
}
}
int main(int argc, char *argv[])
{
//freopen("1.in","r",stdin);
//freopen("1.out","w",stdout);
int n;scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d%lf%lf",&q[i].ispo,&q[i].o.x,&q[i].o.y);
if(q[i].ispo)ans[i]=true;
}
for(int i=;i<=n&&q[i].ispo;i++)ans[i]=false;
imerge(,n);
for(int i=;i<=n;i++)
if(q[i].ispo)puts(ans[i]?"Yes":"No");
return ;
}
BZOJ2961: 共点圆的更多相关文章
- BZOJ2961 共点圆[CDQ分治]
题面 bzoj 其实就是推一下圆的式子 长成这个样子 假设要查询的点是(x, y) 某个圆心是(p, q) \((x - p)^2 + (y - q)^2 \leq p^2 + q^2\) 变成 \( ...
- bzoj2961 共点圆 bzoj 4140
题解: 比较水的一道题 首先我们化简一下式子发现是维护xxo+yyo的最值 显然是用凸包来做 我们可以直接用支持插入删除的凸包 也是nlogn的 因为没有强制在线,我们也可以cdq,考虑前面一半对答案 ...
- bzoj2961 共点圆 (CDQ分治, 凸包)
/* 可以发现可行的圆心相对于我们要查询的点是在一个半平面上, 然后我们要做的就是动态维护凸壳然后用这个半平面去切它 看看是否是在合法的那一面 然后cdq分治就可以了 代码基本是抄的, */ #inc ...
- BZOJ2961: 共点圆(CDQ分治+凸包)
题面 传送门 题解 这题解法真是多啊--据说可以圆反演转化为动态插入半平面并判断给定点是否在半平面交中,或者化一下改成给定点判断是否所有点都在某一个半平面内-- 鉴于圆反演我也不会,这里讲一下直接推的 ...
- [BZOJ2961]共点圆-[凸包+cdq分治]
Description 传送门 Solution 考虑对于每一个点: 设圆的坐标为(x,y),点的坐标为(x0,y0).依题意得,当一个点在圆里,需要满足(x-x0)2+(y-y0)2<=x2+ ...
- [BZOJ2961] 共点圆 [cdq分治+凸包]
题面 BZOJ传送门 思路 首先考虑一个点$(x_0,y_0)$什么时候在一个圆$(x_1,y_1,\sqrt{x_1^2+y_1^2})$内 显然有:$x_1^2+y_1^2\geq (x_0-x_ ...
- 【BZOJ2961】共点圆(CDQ分治)
[BZOJ2961]共点圆(CDQ分治) 题面 BZOJ 题解 设询问点\((x,y)\),圆心是\((X,Y)\) 那么如果点在园内的话就需要满足 \((X-x)^2+(Y-y)^2\le X^2+ ...
- 【BZOJ4140】共点圆加强版(二进制分组)
[BZOJ4140]共点圆加强版(二进制分组) 题面 BZOJ 题解 我卡精度卡了一天.... 之前不强制在线的做法是\(CDQ\)分治,维护一个凸壳就好了. 现在改成二进制分组,每次重建凸壳就好了. ...
- 【bzoj2961】 共点圆
http://www.lydsy.com/JudgeOnline/problem.php?id=2961 (题目链接) 题意 按照一定的顺序给出一些圆和一些点,对于每一个点问是否在所有圆内. Solu ...
随机推荐
- python 类属性和实例属性
class AAA(): aaa = 10 # 情形1 obj1 = AAA() obj2 = AAA() print obj1.aaa, obj2.aaa, AAA.aaa # 情形2 obj1.a ...
- char与 int 类型转化问题汇总
1.char变为int时高位符号扩展问题 int main() { char a = 0x9a; int util; util = (int)a; if(util > 0) printf(&qu ...
- 窗体皮肤实现 - 实现简单Toolbar(六)
自定义皮肤很方便,基础开发的工作也是很大的.不过还好一般产品真正需要开发的并不是很多.现在比较漂亮的界面产品都会有个大大的工具条. Toolbar工具条实现皮肤的方法还是可以使用Form的处理方案.每 ...
- Linux查看文件以及文件夹的大小
df可以查看一级文件夹大小.使用比例.档案系统及其挂入点,但对文件却无能为力.du可以查看文件及文件夹的大小. df命令可以显示目前所有文件系统的可用空间及使用情形,请看下列这个例子: df命令可以查 ...
- Mysql数据库基本配置
一 数据库基本配置包括编码方式 (安装环境是在linux下) 1.1 进入数据库 开启数据库服务:service mysqld start/restart(如果开启话可以重启) 关闭数据库服务:ser ...
- Linux编译内核提示'make menuconfig' requires the ncurses libraries错误
原来使用的ubuntu 11.10系统由于误操作,导致系统崩溃,重新安装了ubuntu 11.10: 在编译内核的时候,提示如下错误: dingq@wd-u1110:~/hwsvn/2sw/1prj_ ...
- android Init 相关分析
Init.c主要工作 1. 初始化属性(包括建立/dev./proc等目录.初始化属性.log.执行init.rc等初始化文件中的action等). 2. 解析配置文件的命令(主要是init.rc文件 ...
- 调试mvc 源码【转:http://www.cnblogs.com/wucj/archive/2013/06/09/3128698.html】
最近在研究asp.net mvc的源码,于是在想,既然提供了源码,那我们如何进入源码调试了?在网上找了一些调试的方法,试了几个都不行,于是折腾了一上午,终于弄出来了,下面看看我的操作步骤. 一:准 ...
- (转)RSA算法原理
RSA算法原理(二) 作者: 阮一峰 日期: 2013年7月 4日 上一次,我介绍了一些数论知识. 有了这些知识,我们就可以看懂RSA算法.这是目前地球上最重要的加密算法. 六.密钥生成的步骤 我 ...
- MATLAB GUI程序设计中使文本框接收多行输入的方法
对于文本框来说 Max属性于Min属性数值之差小于等于1时,仅接收单行输入 大于1时,接受多行输入 对于多行情况,set/get到的String应为cell 本系列文章允许转载,转载请保留全文! [说 ...