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 ...
随机推荐
- web.config的奇淫巧技
<connectionStrings configSource="db.config"/> 外部文件db.config: <connectionStrings&g ...
- 用O(1)的时间复杂度,找到栈和队列中的最小(大)值
最近刷剑指offer,看到两道编程题,考察在O(1)的复杂度内,找出最值. 觉得很有意思,很有借鉴意义,故记录在此. 需要注意的是,这里所说的O(1) 有个前提, 就是已经通过某种容器的存储方式进行初 ...
- python中split与join
1.split个人最喜欢的就是它能使输入的一连串数字变为list. str=raw_input("some ") str2=str.split(" ") str ...
- python 上下文管理器
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 上下文管理器(context manager)是Python2.5开始支持的一种语 ...
- python datetime 时间日期处理小结
python datetime 时间日期处理小结 转载请注明出处:http://hi.baidu.com/leejun_2005/blog/item/47f340f1a85b5cb3a50f5232. ...
- Python脚本控制的WebDriver 常用操作 <六> 打印当前页面的title及url
下面将使用WebDriver来答应浏览器页面的title和访问的地址信息 测试用例场景 测试中,访问1个页面然后判断其title是否符合预期是很常见的1个用例: 假设1个页面的title应该是'hel ...
- 《Prism 5.0源码走读》 设计模式
Prism或Prism构建的应用程序时会使用大量的设计模式,本文简要列举Prism相关的那些设计模式. Adapter(适配器模式):Prism Library主要在Region和IoC contai ...
- Java当中的I/O的字符流
字符流读写文件时,以字符为基础 I/O当中字符流的核心类 Reader类和Writer类是所有字符流类的父类,同样也是抽象类.FileReader和FileWriter分别是它们的子类. 核心类的核心 ...
- NOJ1018-深度遍历二叉树
题目要求很简单,前中后序遍历一棵二叉树.坑爹的是这道题的输入数据和测试数据压根不一样,找了好久原因,去讨论区看见有别人发的测试样例,修改了一下就AC了 测试样例是这个:DEH##FJ##G#CK### ...
- bootstrap bootstrapTable 隐藏列
主要代码: <script type="text/javascript"> $(function () { LoadingDataListOrderRealItems( ...